kld-sdd 2.6.1 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/templates/skills/kld-sdd/opsx-apply/SKILL.md +28 -21
  3. package/templates/skills/kld-sdd/opsx-apply/checklist.md +36 -30
  4. package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +27 -31
  5. package/templates/skills/kld-sdd/opsx-apply/reference.md +7 -38
  6. package/templates/skills/kld-sdd/opsx-check/SKILL.md +8 -11
  7. package/templates/skills/kld-sdd/opsx-check/checklist.md +4 -10
  8. package/templates/skills/kld-sdd/opsx-design/SKILL.md +2 -0
  9. package/templates/skills/kld-sdd/opsx-design/checklist.md +1 -0
  10. package/templates/skills/kld-sdd/opsx-propose/reference.md +8 -18
  11. package/templates/skills/kld-sdd/opsx-rules/reference.md +1 -1
  12. package/templates/skills/kld-sdd/opsx-spec/SKILL.md +2 -0
  13. package/templates/skills/kld-sdd/opsx-task/SKILL.md +26 -43
  14. package/templates/skills/kld-sdd/opsx-task/checklist.md +4 -10
  15. package/templates/skills/kld-sdd/opsx-task/reference.md +12 -6
  16. package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/SKILL.md +79 -0
  17. package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/reference.md +203 -0
  18. package/templates/skills/kld-sdd/opsx-tdd-core/SKILL.md +167 -0
  19. package/templates/skills/kld-sdd/opsx-tdd-core/checklist.md +55 -0
  20. package/templates/skills/kld-sdd/opsx-tdd-core/reference.md +146 -0
  21. package/templates/skills/kld-sdd/opsx-tdd-metrics/SKILL.md +73 -0
  22. package/templates/skills/kld-sdd/opsx-tdd-metrics/checklist.md +60 -0
  23. package/templates/skills/kld-sdd/opsx-tdd-quality/SKILL.md +95 -0
  24. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/cause-effect-clarity.md +19 -0
  25. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/clean-test-data.md +33 -0
  26. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/existing-test-awareness.md +17 -0
  27. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/given-when-then.md +44 -0
  28. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/good-test-qualities.md +32 -0
  29. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/mock-boundary.md +44 -0
  30. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/naming-conventions.md +37 -0
  31. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/no-logic-in-tests.md +30 -0
  32. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/one-test-one-scenario.md +23 -0
  33. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/parameterized-testing.md +56 -0
  34. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/prefer-public-apis.md +17 -0
  35. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/test-behaviors-not-methods.md +26 -0
  36. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/argument-matching.md +38 -0
  37. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/controller-test-rules.md +37 -0
  38. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/domain-service-rules.md +33 -0
  39. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/java-test-template.md +42 -0
  40. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/json-serialization.md +34 -0
  41. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/logging-rules.md +35 -0
  42. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/post-generation/compilation-verification.md +25 -0
  43. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/post-generation/execution-verification.md +28 -0
  44. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/python/py-test-template.md +40 -0
  45. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/typescript/ts-test-template.md +45 -0
  46. package/templates/skills/kld-sdd/opsx-tdd-review/SKILL.md +66 -0
  47. package/templates/skills/kld-sdd/opsx-tdd-review/checklist.md +39 -0
  48. package/templates/skills/kld-sdd/opsx-tdd-rules/SKILL.md +29 -0
  49. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/controller-strategy.md +32 -0
  50. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/dag-generation-rules.md +20 -0
  51. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/des-step-annotation.md +36 -0
  52. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/exception-path-coverage.md +47 -0
  53. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/green-scope-declaration.md +45 -0
  54. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/green-yagni-fence.md +41 -0
  55. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/multi-validation-split.md +36 -0
  56. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/non-tdd-modules.md +17 -0
  57. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/refactor-checklist.md +45 -0
  58. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/task-type-definitions.md +23 -0
  59. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/tdd-strategy-selection.md +13 -0
  60. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-execution-gate.md +25 -0
  61. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +19 -0
  62. package/templates/skills/kld-sdd/opsx-test/SKILL.md +4 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kld-sdd",
3
- "version": "2.6.1",
3
+ "version": "2.6.2",
4
4
  "description": "KLD SDD OpenSpec 项目初始化工具 - 一键部署 SDD skills",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -191,35 +191,40 @@ e. **⛔ 测试执行门禁** — 按 `proposal.md` 的 `test-strategy` 决定
191
191
  f. **⛔ 立即更新任务状态** — tasks.md `- [ ]`→`- [x]` 与 `**状态**: [ ]`→`[x]` 两种格式同步;显示 `✅ [TASK-ID] 已完成 [N/M]`;记录任务级 Telemetry(`task_update`,命令模板见 `./reference.md`)。
192
192
  g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下一层级任务。
193
193
 
194
- **【S2 逐任务红绿节奏】**:每个任务完成后,在编译检查(d)和测试门禁(e)之外,如果 `test-strategy` 为 `tdd`,要求:
195
- 1. **测试-RED 任务**:编写带真实断言的测试 → 运行测试 → 确认失败(失败原因必须是功能未实现)→ 记录失败原因
196
- 2. **实现-GREEN 任务**:读取对应 RED 的失败原因 → 写最少代码让测试通过 → 运行测试确认通过
197
- 3. **重构-REFACTOR 任务**:在测试全绿状态下重构 → 运行全部测试确认仍绿
198
- 4. 再进入下一个任务
194
+ **【S2 逐任务红绿节奏】**(test-strategy=tdd 时):
199
195
 
200
- 这确保每个行为点都有对应的测试保护,测试真实驱动实现,而非最后统一跑测试。
196
+ ⛔ TDD 铁律:NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
197
+ 先写了生产代码?删除它,从测试开始。
201
198
 
202
- **【S2.1 RED 测试质量标准】**(test-strategy=tdd 时强制):
199
+ **TDD RED→GREEN 对严格串行,不适用同层并行派发**。即使 DAG 显示同层有多个 RED→GREEN 对,也必须逐对完成:RED-N → GREEN-N → RED-(N+1) → GREEN-(N+1)。禁止一次性编写多个 RED 测试再一次性实现多个 GREEN。
203
200
 
204
- > 核心原则:**Mock 边界,不 Mock 行为**
205
- >
206
- > 测试应验证**真实行为链路**(输入→输出),而非验证"能否 catch mock 抛的异常"。
201
+ 1. **RED**:编写带真实断言的测试 运行 确认失败(失败原因必须是功能未实现)→ 记录失败原因
202
+ - ⛔ 只写当前 RED 对应的测试方法,不提前编写后续 RED 的测试
203
+ 2. **🔴 中断声明**:RED 确认失败后,显式声明 `🔴 RED-N 确认失败,原因:XXX。现在进入 GREEN-N`
204
+ 3. **GREEN**:读取 RED 失败原因 → 执行 GREEN Scope 声明 → 逐条确认 YAGNI 围栏 → 写最少代码让测试通过 → 禁止捆绑未测试代码
205
+ 4. **GREEN Scope 门禁**:Verify GREEN 之后,检查生产代码无越界逻辑分支(属于后续 RED 的行为 → 删除)
206
+ 5. **REFACTOR**:在测试全绿状态下重构 → 运行全部测试确认仍绿
207
+ 6. 再进入下一个任务
207
208
 
208
- 1. **禁止 mock 被测行为本身**:测试的 Given 应准备**真实的前置条件**(如真实的 invalid token 字符串),让被测代码自然走完链路;而非直接 mock 出**期望的中间结果**(如 mock parseToken 抛异常)
209
- - `when(jwtUtil.parseToken("invalid")).thenThrow(...)` — mock 了被测行为(token 解析失败),GREEN 只需加 try-catch
210
- - 使用真实 JwtUtil + 真实 invalid token 字符串,让解析自然失败,测试验证完整链路
209
+ > 完整执行步骤见 opsx-tdd-core/reference.md §1-§3
210
+ > 合理化预防表见 opsx-tdd-core/SKILL.md §7
211
+ > REFACTOR 检查点见 opsx-tdd-rules/rules/refactor-checklist.md
212
+ > 异常路径覆盖门禁见 opsx-tdd-rules/rules/exception-path-coverage.md
211
213
 
212
- 2. **Mock 仅用于系统边界依赖**:数据库 Mapper、HTTP 客户端、消息队列等外部依赖可 mock;但被测类自身的业务逻辑、实现被测行为的工具类不可 mock
213
- - ✅ Mock `BookMapper.countByPublisher()` — 数据库边界,需要真实 DB 环境才能验证
214
- - ❌ Mock `JwtUtil.parseToken()` — 这是被测行为的实现,mock 它等于跳过了被测逻辑
214
+ **【S2.1 RED 测试质量标准】**(test-strategy=tdd 时强制):
215
215
 
216
- 3. **RED 测试的 Given 必须是真实输入**:传入真实的数据(如 `"invalid"` 字符串、`null`、空对象),让被测代码自行处理;不能 mock 出"这个输入会导致什么结果"
217
- - `when(parseToken("invalid")).thenThrow()` — 预定了"invalid 会导致抛异常"这个结论
218
- - 传入 `"invalid"` 字符串,让真实的 parseToken 自行决定是否失败
216
+ RED 测试质量门禁见 `./checklist.md`「§5e.2 RED 测试质量门禁」,核心包括:
217
+ - Mock 边界(引用 opsx-tdd-quality/SKILL.md §2)
218
+ - 测试命名与结构(引用 opsx-tdd-quality/SKILL.md §3-§4)
219
+ - 断言深度(引用 opsx-tdd-anti-patterns/SKILL.md §4 反模式 14)
220
+ - RED 阶段反模式检查(引用 opsx-tdd-anti-patterns/SKILL.md §3)
219
221
 
220
- 4. **GREEN 实现后测试不应需要修改**:测试描述行为契约(输入→期望输出),GREEN 只写让契约满足的最少代码。如果 GREEN 后需要改测试才能通过,说明 RED 测试有问题
222
+ BEFORE 编写 RED 测试,必须读取:
223
+ - opsx-tdd-anti-patterns/SKILL.md §3(RED 阶段 3 种反模式 + 门禁函数)
224
+ 读取后在报告中确认:"已读取 RED 阶段反模式检查表"。
221
225
 
222
- 5. **判断标准**:如果删掉被测类的实现(方法体清空),测试是否仍然因为 mock 而通过?如果是,说明测试是假的——真实测试应该在实现缺失时失败
226
+ > 完整 Mock 边界矩阵见 opsx-tdd-quality/SKILL.md §2
227
+ > 完整 15 种反模式见 opsx-tdd-anti-patterns/SKILL.md §3-§4
223
228
 
224
229
  ### 5f. 【S3 apply 结束前 checkbox 全量自检】
225
230
 
@@ -276,6 +281,8 @@ g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下
276
281
  - **⛔ 编译检查门禁**:每完成一个任务后必须运行编译检查,编译失败禁止标记已完成。
277
282
  - **⛔ 测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry。${HOOK_GATE_DESCRIPTION}
278
283
  - **⛔ 必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式同步。
284
+ - **⛔ task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改。
285
+ - **⛔ TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED。
279
286
  - **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行。
280
287
  - **⛔ Step 0.1 隔离校验必做**:建 worktree / 建议分支名前必须完成 proposal + 跨 cap spec 依赖校验并输出报告。
281
288
  - **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行。
@@ -34,36 +34,41 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
34
34
 
35
35
  ### §5e 测试执行门禁(按 `proposal.md` 的 `test-strategy`)
36
36
 
37
- - [ ] `tdd` → **⛔ 强制执行**:
38
- - 测试-RED 任务:运行测试确认**失败**,失败原因必须是功能未实现(非编译错误)
39
- - 实现-GREEN 任务:运行测试确认**通过**
40
- - 重构-REFACTOR 任务:运行**全部测试**确认仍绿
41
- - 测试失败禁止继续,必须修复
42
- - [ ] `impl-first` → **⚠️ 警告模式**:运行测试,失败时显示警告但允许继续
43
- - [ ] `none` → **跳过**:不执行测试门禁
37
+ > 测试执行门禁策略见 opsx-tdd-rules/rules/test-execution-gate.md
38
+
39
+ - [ ] `tdd` → ⛔ 强制执行(RED 确认失败、GREEN 确认通过、REFACTOR 全部测试仍绿)
40
+ - [ ] `impl-first` → ⚠️ 警告模式
41
+ - [ ] `none` → 跳过
44
42
 
45
43
  ### §5e.1 TDD 执行合规自检(仅 test-strategy=tdd 时)
46
44
 
47
- - [ ] RED 任务执行后已运行测试并确认失败
48
- - [ ] RED 任务失败原因是"功能未实现"而非编译错误
49
- - [ ] GREEN 任务执行后已运行测试确认通过
50
- - [ ] GREEN 任务未提前实现没有测试要求的功能
51
- - [ ] REFACTOR 任务执行后已运行全部测试确认仍绿
52
- - [ ] 未出现"先写生产代码再补测试"的情况
45
+ 每完成一个 RED/GREEN/REFACTOR 任务后,必须执行 `opsx-tdd-core/checklist.md` §A(7 项)逐项勾选。
46
+
47
+ > 不在此内联复制,以 opsx-tdd-core/checklist.md §A 为唯一真相源。
48
+ > 额外补充:REFACTOR 任务还需执行 `opsx-tdd-rules/rules/refactor-checklist.md`(7 项重构检查点)。
53
49
 
54
50
  ### §5e.2 RED 测试质量门禁(仅 test-strategy=tdd 时,RED 任务完成后强制检查)
55
51
 
56
- > 核心原则:**Mock 边界,不 Mock 行为**
52
+ 核心原则(引用 opsx-tdd-quality/SKILL.md §2):Mock 边界,不 Mock 行为
53
+ - [ ] 未 mock 被测行为本身
54
+ - [ ] Mock 仅用于系统边界依赖(Mapper/HTTP)
55
+ - [ ] RED 测试 Given 是真实输入
56
+
57
+ ⛔ 测试命名与结构(引用 opsx-tdd-quality/SKILL.md §3-§4):
58
+ - [ ] 测试方法名符合 `{method}_{given}_{expected}` 格式
59
+ - [ ] 测试包含 `// Given` / `// When` / `// Then` 注释结构
60
+ - [ ] 一测一场景(测试方法名不含 "and")
57
61
 
58
- - [ ] **未 mock 被测行为本身**:测试的 Given 准备的是真实前置条件(如真实 invalid token 字符串),让被测代码自然走完链路;而非直接 mock 出期望的中间结果
59
- - `when(jwtUtil.parseToken("invalid")).thenThrow(...)` mock 了被测行为(解析失败),GREEN 只需加 try-catch
60
- - 使用真实 JwtUtil + 真实 invalid token,让解析自然失败
61
- - [ ] **Mock 仅用于系统边界依赖**:数据库 Mapper、HTTP 客户端等外部依赖可 mock;被测类自身的业务逻辑、实现被测行为的工具类不可 mock
62
- - Mock `BookMapper.countByPublisher()` — 数据库边界
63
- - ❌ Mock `JwtUtil.parseToken()` 被测行为的实现
64
- - [ ] **RED 测试的 Given 是真实输入**:传入真实数据让被测代码自行处理,不 mock 出"这个输入会导致什么结果"
65
- - [ ] **删掉实现后测试仍因 mock 而通过?** 如果是 → 测试是假的,必须重写
66
- - [ ] **GREEN 后测试不需要修改**:如果 GREEN 后需要改测试才能通过 → RED 测试有问题
62
+ 断言深度(引用 opsx-tdd-anti-patterns/SKILL.md §4 反模式 14):
63
+ - [ ] 每个测试至少有一个具体值断言(assertEquals),而非仅 assertNotNull
64
+ - [ ] 异常测试使用 `assertThrows(BusinessException.class, ...)` 并验证错误码(而非 RuntimeException.class)
65
+
66
+ BEFORE 标记 RED 任务完成,必须读取:
67
+ - opsx-tdd-anti-patterns/SKILL.md §3(RED 阶段反模式检查)
68
+ 读取后确认:"已检查 RED 阶段反模式"
69
+
70
+ > 完整质量门禁见 opsx-tdd-quality/SKILL.md §2-§6
71
+ > 完整 15 种反模式见 opsx-tdd-anti-patterns/SKILL.md §3-§4
67
72
 
68
73
  ### 任务状态实时更新
69
74
 
@@ -72,19 +77,18 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
72
77
  - [ ] 两种格式同步更新,不可遗漏
73
78
  - [ ] 显示进度:`✅ [TASK-ID] 已完成 [N/M]`
74
79
  - [ ] 记录任务级 Telemetry(`task_update`,`--task-id=<TASK-ID>` 必填,否则 E4 指标无法计算);TDD 测试骨架任务须在 `--details-json` 带 `"task_kind":"test-skeleton"`(P3,避免红灯误判拉低 E4)
80
+ - [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `node skywalk-sdd/index.cjs check-task --project=. --change=<变更名称> --task-id=<TASK-ID>` 确认 tasks.md 中对应行已从 `- [ ]` 变为 `- [x]`;若未更新,手动修改 tasks.md 并报告
75
81
 
76
82
  ---
77
83
 
78
84
  ## §6.0 单元测试真实执行自检(`test-strategy` 非 `none`)
79
85
 
80
- - [ ] 在结束 apply 或 §6.1 收尾之前,在项目根或 worktree 内**真实运行**单元测试命令(`npm test` / `pytest` / `go test` 等)
81
- - [ ] 留下可核验 telemetry 证据(任选其一):
82
- - `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
83
- - `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
84
- - 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
86
+ > 单元测试真实执行自检见 opsx-tdd-core/reference.md §9
87
+
88
+ - [ ] 真实运行单元测试命令并留 telemetry 证据
85
89
  - [ ] `tdd`:无测试证据不得结束 apply / 不得 finish worktree
86
90
  - [ ] `impl-first`:实现后必须补跑并记录
87
- - [ ] `none`:跳过本节与 test gate
91
+ - [ ] `none`:跳过
88
92
 
89
93
  ---
90
94
 
@@ -108,8 +112,10 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
108
112
  - [ ] ⛔ **DAG 依赖拦截**:执行任务前必须检查依赖,前置未完成必须拦截
109
113
  - [ ] ⛔ **编译检查门禁**:每完成一个任务后必须运行编译检查,编译失败禁止标记已完成
110
114
  - [ ] ⛔ **测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry,`sdd-apply-test-gate` 校验非占位数据
111
- - [ ] ⛔ **RED 测试质量门禁**:Mock 边界不 Mock 行为;未 mock 被测行为本身;Mock 仅用于系统边界依赖;RED 测试 Given 是真实输入
115
+ - [ ] ⛔ **RED 测试质量门禁**:见 §5e.2(引用 opsx-tdd-quality + opsx-tdd-anti-patterns,不在此内联复制)
112
116
  - [ ] ⛔ **必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式(`- [ ]`→`- [x]` 与 `**状态**: [ ]`→`[x]`)同步
117
+ - [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改
118
+ - [ ] ⛔ **TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED
113
119
  - [ ] **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行
114
120
  - [ ] ⛔ **Step 0.1 隔离校验必做**:建 worktree / 建议分支名前必须完成 proposal + 跨 cap spec 依赖校验并输出报告;未通过不得按 full 并行策略拆 `kld-sdd/<change>/<cap>`
115
121
  - [ ] **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行
@@ -4,44 +4,36 @@
4
4
 
5
5
  ## TDD 铁律(当 test-strategy=tdd 时生效)
6
6
 
7
- **NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.**
8
-
9
- - 如果要写生产代码,必须先有一个失败的测试
10
- - 如果先写了生产代码再写测试:删掉生产代码,从测试开始
7
+ NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.
8
+ - 先写了生产代码再写测试?删掉生产代码,从测试开始
11
9
  - "太简单不用测" → 如果值得写,就值得测
12
10
  - "事后补测一样" → 不一样,TDD 的价值在于测试驱动设计
13
- - "删了浪费" → 删掉重来比带着错误前提实现更省时间
14
11
 
15
12
  ### 执行 测试-RED 任务
16
- 1. 读取对应 spec.md 场景和 design.md 设计
13
+ 1. 读取 spec.md 场景和 design.md 设计
17
14
  2. 编写测试代码:Given-When-Then 结构 + 真实断言
18
- 3. 运行测试:`mvn test -Dtest=XxxTest#testMethodName`(或项目对应命令)
19
- 4. 确认测试失败:失败原因必须是"功能未实现"(如 NullPointerException、AssertionError)
20
- 5. 如果测试通过:说明测试无效或功能已存在,重新编写测试
21
- 6. 记录失败原因到任务状态
22
-
23
- **⛔ RED 测试质量标准(Mock 边界,不 Mock 行为):**
24
-
25
- - **禁止 mock 被测行为本身**:测试的 Given 应准备**真实的前置条件**(如真实的 invalid token 字符串),让被测代码自然走完链路;而非直接 mock 出期望的中间结果
26
- - `when(jwtUtil.parseToken("invalid")).thenThrow(...)` mock 了被测行为(解析失败),GREEN 只需加 try-catch 就通过,测试无意义
27
- - ✅ 使用真实 JwtUtil + 真实 invalid token 字符串,让解析自然失败,测试验证完整链路
28
- - **Mock 仅用于系统边界依赖**:数据库 Mapper、HTTP 客户端、消息队列等外部依赖可 mock;但被测类自身的业务逻辑、实现被测行为的工具类不可 mock
29
- - ✅ Mock `BookMapper.countByPublisher()` — 数据库边界,需要真实 DB 环境才能验证
30
- - ❌ Mock `JwtUtil.parseToken()` — 这是被测行为的实现,mock 它等于跳过了被测逻辑
31
- - **RED 测试的 Given 必须是真实输入**:传入真实的数据(如 `"invalid"` 字符串、`null`、空对象),让被测代码自行处理;不能 mock 出"这个输入会导致什么结果"
32
- - **判断标准**:如果删掉被测类的实现(方法体清空),测试是否仍然因为 mock 而通过?如果是,说明测试是假的——真实测试应该在实现缺失时失败
15
+ 3. 运行测试,确认失败(失败原因必须是功能未实现)
16
+ 4. 如果测试通过:说明测试无效或功能已存在,重新编写
17
+ 5. ⛔ 检查异常路径覆盖:每个 orElseThrow/边界检查须有对应测试方法(见 `opsx-tdd-rules/rules/exception-path-coverage.md`)
18
+
19
+ ⛔ BEFORE 编写测试代码,必须读取对应语言的规则文件:
20
+ - Java:opsx-tdd-quality/rules/java/java-test-template.md + argument-matching.md + domain-service-rules.md
21
+ - TypeScript:opsx-tdd-quality/rules/typescript/ts-test-template.md
22
+ - Python:opsx-tdd-quality/rules/python/py-test-template.md
23
+ - 通用:opsx-tdd-quality/rules/general/naming-conventions.md + given-when-then.md + no-logic-in-tests.md
24
+ 读取后在报告中列出已读取的规则文件路径。
33
25
 
34
26
  ### 执行 实现-GREEN 任务
35
27
  1. 读取对应 RED 任务的失败原因
36
- 2. 编写**最少代码**让该测试通过
37
- 3. 不提前实现没有测试要求的功能(YAGNI)
38
- 4. **⛔ 禁止捆绑未测试的代码**:
39
- - 如果 RED 测试只测了 Service 方法,GREEN 不得同时实现 Controller 接口
40
- - 如果 RED 测试只测了一个行为点,GREEN 不得同时实现其他行为点的逻辑
41
- - 如果需要修改多个文件才能让测试通过,检查是否测试范围过大
42
- 5. 运行测试:确认通过
43
- 6. 如果引入了新功能但无对应测试:删除多余代码
44
- 7. 自检:本次修改的文件列表是否与 RED 测试覆盖的范围一致?如果超出,报告 DONE_WITH_CONCERNS
28
+ 2. 【Scope 声明】按 `opsx-tdd-rules/rules/green-scope-declaration.md` 执行 Scope 声明步骤
29
+ 3. 编写最少代码——仅实现 Scope 声明中标记为"属于当前 RED"的步骤
30
+ 4. 【Scope 自检】检查生产代码中是否有未被任何当前 RED 断言覆盖的逻辑路径?有则删除
31
+ 5. 不提前实现没有测试要求的功能(YAGNI)
32
+ 6. 禁止捆绑未测试的代码(Controller/Filter/Config)
33
+
34
+ > 完整执行步骤见 opsx-tdd-core/reference.md §1-§3
35
+ > 完整质量标准见 opsx-tdd-quality/SKILL.md §2
36
+ > Scope 声明规则见 opsx-tdd-rules/rules/green-scope-declaration.md
45
37
 
46
38
  ### 执行 重构-REFACTOR 任务
47
39
  1. 在所有测试通过的状态下开始
@@ -49,6 +41,9 @@
49
41
  3. 运行**全部测试**:`mvn test`(或项目对应命令)
50
42
  4. 确认所有测试仍通过
51
43
  5. 如果任何测试失败:回退重构,重新尝试
44
+ 6. ⛔ 执行 `opsx-tdd-rules/rules/refactor-checklist.md`(7 项重构检查点)
45
+
46
+ > 完整 REFACTOR 检查点见 opsx-tdd-rules/rules/refactor-checklist.md
52
47
 
53
48
  ## 派发格式
54
49
 
@@ -99,7 +94,7 @@ Agent (general-purpose):
99
94
  3. 遵循 overview.md 的全局规范
100
95
  4. 保持变更最小化,不超出任务范围
101
96
  5. **当任务类型为 测试-RED 时**:编写带真实断言的测试,运行并确认失败,记录失败原因
102
- 6. **当任务类型为 实现-GREEN 时**:读取对应 RED 的失败原因,写最少代码让测试通过,不提前实现未要求的功能
97
+ 6. **当任务类型为 实现-GREEN 时**:读取对应 RED 的失败原因,按 `opsx-tdd-rules/rules/green-scope-declaration.md` 执行 Scope 声明,仅实现标记为"属于"的步骤,写最少代码让测试通过,不提前实现未要求的功能
103
98
  7. **当任务类型为 重构-REFACTOR 时**:在测试全绿状态下优化代码,运行全部测试确认仍绿
104
99
  8. 自我审查(见下方)
105
100
  9. 报告结果
@@ -144,6 +139,7 @@ Agent (general-purpose):
144
139
  - 是否避免了过度工程(YAGNI)?
145
140
  - 是否只构建了任务要求的内容?
146
141
  - 是否避免了对无关文件的修改?
142
+ - **GREEN 任务 Scope 检查**:生产代码中是否存在未被当前 RED 断言覆盖的逻辑分支?若存在且属于后续 RED 的行为,是否已删除?
147
143
 
148
144
  如果在自我审查中发现问题,先修复再报告。
149
145
 
@@ -22,13 +22,9 @@ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. -
22
22
 
23
23
  **⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID,否则 E4 指标无法计算。
24
24
 
25
- **🧪 TDD 测试骨架任务(`test-strategy: tdd`)**:当任务是"测试骨架"(仅编写测试用例、实现尚未编写,测试预期失败/红灯)时,`task_update` 必须在 `--details-json` 中带 `"task_kind":"test-skeleton"`,`--result=success`(骨架按 TDD 计划完成即成功),`test_results.failed` 如实记录红灯数。这样 E4 一次成码率不会把 TDD 预期红灯误判为成码失败(P3)。实现任务不带 `task_kind`(默认 implementation),按真实测试结果记录。
25
+ **🧪 TDD 测试骨架任务(`test-strategy: tdd`)**:当任务是"测试骨架"时,`task_update` 必须在 `--details-json` 中带 `"task_kind":"test-skeleton"`。
26
26
 
27
- TDD 测试骨架任务示例:
28
-
29
- ```bash
30
- node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 测试骨架完成(TDD 红灯)" --details-json="{\"task_kind\":\"test-skeleton\",\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":<红灯数>,\"skipped\":0,\"duration_ms\":0}}"
31
- ```
27
+ > 完整 test-skeleton telemetry 模板见 opsx-tdd-rules/rules/test-skeleton-telemetry.md
32
28
 
33
29
  **📄 通过文件传递大 payload**:若 `details-json` 内容过长,可先写入 `skywalk-sdd/state/<变更名称>-task-update.json`,再使用 `--details-file` 指定该文件:
34
30
 
@@ -353,44 +349,17 @@ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --proj
353
349
 
354
350
  ## §6.0 单元测试真实执行(`test-strategy` 非 `none`)
355
351
 
356
- `proposal.md` 的 `test-strategy` 为 **`tdd`** 或 **`impl-first`** 时:
357
-
358
- 1. **在结束 apply 或执行 §6.1 收尾之前**,必须在项目根或 worktree 内**真实运行**单元测试命令(`npm test` / `pytest` / `go test` 等)。
359
- 2. 须留下可核验的 telemetry 证据(任选其一):
360
- - `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
361
- - `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
362
- - 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
363
- 3. **Claude Code**:`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验;无证据则**阻断**并提示补跑测试。
352
+ > 单元测试真实执行见 opsx-tdd-core/reference.md §9
364
353
 
365
- | test-strategy | 行为 |
366
- |---------------|------|
367
- | `tdd` | 无测试证据不得结束 apply / 不得 finish worktree |
368
- | `impl-first` | 同上,实现后必须补跑并记录 |
369
- | `none` | 跳过本节与 test gate |
354
+ `test-strategy` `tdd` 或 `impl-first` 时,必须真实运行单元测试并留 telemetry 证据。`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验。
370
355
 
371
356
  ---
372
357
 
373
- ## §6.0a 测试反模式检查(TDD 模式下,RED 阶段 + GREEN 完成后双重检查)
374
-
375
- > ⛔ **RED 阶段就必须检查**:不要等到 GREEN 之后才发现测试是假的。RED 写完立即自检,发现反模式立即重写。
376
-
377
- ### RED 阶段强制检查(写完测试、运行确认失败后)
378
-
379
- | 反模式 | 表现 | 修复方案 |
380
- |--------|------|---------|
381
- | **Mock 被测行为本身** | `when(jwtUtil.parseToken("invalid")).thenThrow(...)` — mock 了被测行为(解析失败),GREEN 只需加 try-catch | 使用真实 JwtUtil + 真实 invalid token,让解析自然失败 |
382
- | **Mock 预定结论而非准备条件** | `when(bookMapper.countByPublisher(1L)).thenReturn(3)` 后只测 `if (count > 0) throw` — trivial 逻辑 | Mock 边界依赖(Mapper)是合理的,但测试断言应验证完整行为链路(如 verify 不会执行 delete) |
383
- | **Given 不是真实输入** | mock 出"这个输入会导致什么结果",而非传入真实数据让被测代码自行处理 | 传入真实数据(如 `"invalid"` 字符串、`null`),让被测代码自行决定结果 |
358
+ ## §6.0a 测试反模式检查(TDD 模式下)
384
359
 
385
- ### GREEN 完成后补充检查
360
+ > 完整 9 种反模式检测见 opsx-tdd-anti-patterns/SKILL.md §3-§4 + reference.md
386
361
 
387
- | 反模式 | 表现 | 修复方案 |
388
- |--------|------|---------|
389
- | 测试 mock 行为而非真实行为 | 测试验证的是 mock 被调用,而非真实业务逻辑 | 测试应验证输出/状态变化,而非方法调用 |
390
- | 生产类中加测试专用方法 | 为方便测试在生产类中加了 public/protected 方法 | 通过公共 API 测试,不加测试专用方法 |
391
- | 不理解依赖就 mock | mock 了不理解的依赖,隐藏了结构假设 | 先理解依赖的职责再决定是否 mock |
392
- | 不完整的 mock | partial mock 隐藏了对象间的结构关系 | 要么完整 mock,要么用真实对象 |
393
- | 集成测试作为事后补充 | 单元测试不足,用集成测试弥补 | 每个行为点应有独立的单元测试 |
362
+ RED 阶段就必须检查,不要等到 GREEN 之后才发现测试是假的。
394
363
 
395
364
  > 参照来源:`skill-references/superpowers-tdd/testing-anti-patterns.md`
396
365
 
@@ -113,17 +113,14 @@ openspec list
113
113
 
114
114
  #### 4.4a TDD 合规性检查(仅 test-strategy=tdd 时执行)
115
115
 
116
- 检查项:
117
- 1. RED 任务验收标准是否包含"测试运行失败"(而非"断言为空")
118
- 2. GREEN 任务是否为行为级粒度(一个 GREEN 对应一个 RED,非模块级)
119
- 3. DAG 中是否存在 RED→GREEN 循环对(而非 TEST(全部)→IMPL(全部)批次)
120
- 4. 是否存在 REFACTOR 任务(推荐但不强制)
121
- 5. TDD 模块(前端/配置/SQL)是否正确排除红绿循环
122
- 6. GREEN 任务验收标准是否为"让对应 RED 通过"(而非"实现完整功能")
123
- 7. **GREEN 任务无捆绑**:每个 GREEN 任务的输出不包含未测试的 Controller/Filter/Config
124
- 8. **Controller 层策略已声明**:tasks.md 中明确声明 Controller 层使用策略 A 或策略 B
125
- 9. **RED 任务有测试方法名**:每个 RED 任务包含 `{method}_{state}_{outcome}` 格式的测试方法名
126
- 10. **REFACTOR 有具体方向**:每个 REFACTOR 任务列出至少 2 个具体重构点
116
+ ⛔ 执行 `opsx-tdd-core/checklist.md` §B(10 项)逐项检查。
117
+
118
+ > 不在此内联复制,以 opsx-tdd-core/checklist.md §B 为唯一真相源。
119
+ > 额外补充:还需检查 `opsx-tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)。
120
+
121
+ BEFORE 完成 TDD 合规性检查,如需深度审查测试质量,必须读取:
122
+ - opsx-tdd-review/SKILL.md(测试质量审查清单 8 + 缺失测试检测)
123
+ 读取后确认:"已读取测试质量审查清单"。
127
124
 
128
125
  #### 4.5 任务完成状态检查(实现后 / 归档前)
129
126
 
@@ -38,16 +38,10 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
38
38
 
39
39
  ## E. TDD 合规性检查(仅 test-strategy=tdd 时)
40
40
 
41
- - [ ] tasks.md 测试-RED 任务的验收标准包含"测试运行失败"
42
- - [ ] tasks.md 中无"断言为空"或"编译通过但断言为空"的验收标准
43
- - [ ] tasks.md 实现-GREEN 任务为行为级粒度(一对一对应 RED)
44
- - [ ] tasks.md 中 DAG 存在 RED→GREEN 循环对
45
- - [ ] tasks.md 中非 TDD 模块未拆红绿循环
46
- - [ ] tasks.md 中 GREEN 任务的输出不包含未测试的 Controller/Filter/Config
47
- - [ ] tasks.md 中已声明 Controller 层处理策略(策略 A 或策略 B)
48
- - [ ] tasks.md 中每个 RED 任务包含测试方法名
49
- - [ ] tasks.md 中每个 REFACTOR 任务列出至少 2 个具体重构点
50
- - [ ] check_result 的 categories 中包含 `tdd_compliance`
41
+ 执行 `opsx-tdd-core/checklist.md` §B(10 项)逐项检查。
42
+
43
+ > 不在此内联复制,以 opsx-tdd-core/checklist.md §B 为唯一真相源。
44
+ > 额外补充:还需检查 `opsx-tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)。
51
45
 
52
46
  ## F. 语义门禁与工作态
53
47
 
@@ -130,6 +130,8 @@ openspec list
130
130
 
131
131
  **输出路径**:`changes/<name>/specs/<capability>/design.md`
132
132
 
133
+ **⛔ DES 步骤级标注(TDD 模式强制)**:当 `test-strategy=tdd` 时,被多个 RED/GREEN 对映射的 DES 元素必须标注步骤级任务归属。规则详见 `opsx-tdd-rules/rules/des-step-annotation.md`
134
+
133
135
  ### 6.5 【version 正则注释】允许前导零
134
136
 
135
137
  design.md 中若使用 version 正则约束(如格式校验 `^\d+\.\d+\.\d+$`),需在正则旁**标注「允许前导零」**:
@@ -29,6 +29,7 @@ description: opsx-design 的阶段强制检查点与自检清单。仅在执行
29
29
  - [ ] 外部依赖已列出
30
30
  - [ ] 异常处理策略已定义
31
31
  - [ ] 文档末尾包含质量红线检查清单
32
+ - [ ] ⛔ **DES 步骤级标注(TDD 模式)**:当 test-strategy=tdd 时,被多个 RED/GREEN 对映射的 DES 元素已标注步骤级 `[GREEN-N]` 归属(规则见 `opsx-tdd-rules/rules/des-step-annotation.md`)
32
33
 
33
34
  **如有任意一项未满足,重新生成对应章节,直至全部通过。**
34
35
 
@@ -52,25 +52,12 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
52
52
 
53
53
  **❗ 必须主动询问用户,不得默认选择**
54
54
 
55
- 使用 **AskUserQuestion** 工具向用户询问:
55
+ 三种策略:
56
+ - A) TDD(红绿重构循环):每个行为点先写失败测试再写最少代码,任务量 3-5 倍
57
+ - B) Impl-First(代码先行):先实现再补测试验证
58
+ - C) None(仅实现):不生成测试任务
56
59
 
57
- > "🧪 **请选择测试策略:**
58
- >
59
- > **A) 测试驱动 (TDD)** - 红绿重构循环
60
- > - 每个行为点先写失败测试(红),再写最少代码让它通过(绿),最后重构
61
- > - DAG: RED → GREEN → REFACTOR → RED → GREEN → ...(行为级小步循环)
62
- > - 任务数量较多(每个行为点一对红绿),但每个测试都真实驱动实现
63
- > - 适合:核心业务逻辑、质量要求高、需要测试驱动设计
64
- > - ⚠️ 注意:TDD 模式下任务数量会显著增加(约为模块级拆分的 3-5 倍)
65
- >
66
- > **B) 实现优先 (Impl-First)** - 代码先行
67
- > - 先生成实现任务,测试作为验证步骤
68
- > - DAG: 实现代码 → 测试验证
69
- > - 适合:UI 层、配置类、快速原型
70
- >
71
- > **C) 无测试 (None)** - 仅实现
72
- > - 不生成测试任务,仅编译检查
73
- > - 适合:简单配置、文档更新"
60
+ 使用 **AskUserQuestion** 工具向用户询问(A/B/C 三选一)。
74
61
 
75
62
  根据用户选择:
76
63
  - 选择 A:设置 `test-strategy: tdd`
@@ -79,6 +66,9 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
79
66
 
80
67
  **将用户选择记录到 proposal.md 的 YAML frontmatter 中。**
81
68
 
69
+ > 完整策略定义见 opsx-tdd-core/SKILL.md §5
70
+ > 交互引导文案见 opsx-tdd-rules/rules/tdd-strategy-selection.md
71
+
82
72
  ---
83
73
 
84
74
  ## §10 质量红线自检清单
@@ -80,7 +80,7 @@ trigger: always_on
80
80
  |------|--------|----------|----------|
81
81
  | 架构规范 | `architecture` | 目录分层、模块边界、入口 | 分层约定、禁止循环依赖、新代码落位 |
82
82
  | 编码规范 | `coding-style` | 语言、lint、缩进 | 命名、缩进、注释语言、CommonJS/ESM |
83
- | 测试约定 | `testing` | test 目录、框架 | 测试命令、命名、TDD 期望 |
83
+ | 测试约定 | `testing` | test 目录、框架 | 测试命令、命名、TDD 期望(见 opsx-tdd-core/SKILL.md §5) |
84
84
  | 数据安全 | `database-safety` | ORM/迁移目录 | 无 DB 时降级为「禁止危险文件操作/敏感数据提交」 |
85
85
  | Git 提交 | `git-commit` | git log 风格、CI | 提交前确认、message 风格、禁止 force push |
86
86
 
@@ -162,6 +162,8 @@ node skywalk-sdd/context-client.cjs --query="<当前 Capability 的自然语言
162
162
  - 需求项使用 `####`(4个#)
163
163
  - 场景使用 `#####`(5个#)
164
164
 
165
+ **⛔ 多校验拆分规则(TDD 关键)**:当单个 STMT 包含多个"必须校验"条件时,每个校验条件必须有对应的独立 AC 场景。规则详见 `opsx-tdd-rules/rules/multi-validation-split.md`
166
+
165
167
  ### 6.5 【Node 版本约束来源校验】
166
168
 
167
169
  若 spec.md 中声明了 Node 版本约束(如 `>=14`、`>=18` 等),必须在该需求项或 proposal.md 中**声明来源**:
@@ -132,33 +132,15 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
132
132
 
133
133
  **若已设置**:向用户确认
134
134
  > "🧪 **当前测试策略:[test-strategy]**
135
- >
136
- > - `tdd`: 红绿重构循环 - 每个行为点先写失败测试(红),再写最少代码让它通过(绿),最后重构
137
- > - `impl-first`: 实现优先 - 先实现后测试
138
- > - `none`: 无测试 - 不生成测试任务
139
- >
135
+ > - `tdd`: 红绿重构循环
136
+ > - `impl-first`: 实现优先
137
+ > - `none`: 无测试
140
138
  > 是否继续使用该策略?"
141
139
 
142
- **若未设置**:使用 **AskUserQuestion** 工具询问
143
- > "🧪 **未检测到测试策略配置,请选择:**
144
- >
145
- > **A) 测试驱动 (TDD)** - 红绿重构循环
146
- > - 每个行为点先写失败测试(红),再写最少代码让它通过(绿),最后重构
147
- > - DAG 顺序:RED → GREEN → REFACTOR → RED → GREEN → ...(行为级小步循环)
148
- > - 任务数量较多(每个行为点一对红绿),但每个测试都真实驱动实现
149
- > - 适合:核心业务逻辑、质量要求高、需要测试驱动设计
150
- > - ⚠️ 注意:TDD 模式下任务数量会显著增加(约为模块级拆分的 3-5 倍)
151
- >
152
- > **B) 实现优先 (Impl-First)** - 代码先行
153
- > - 先生成实现任务,测试作为验证步骤
154
- > - DAG 顺序:实现代码 → 测试验证
155
- > - 适合:UI 层、配置类、快速原型
156
- >
157
- > **C) 无测试 (None)** - 仅实现
158
- > - 不生成测试任务,仅编译检查
159
- > - 适合:简单配置、文档更新"
140
+ **若未设置**:使用 **AskUserQuestion** 工具询问(A/B/C 三选一)
160
141
 
161
- 根据用户选择设置 `test-strategy`,并更新 proposal.md 的 frontmatter(若未设置)。
142
+ > 完整策略定义见 opsx-tdd-core/SKILL.md §5
143
+ > 交互引导文案见 opsx-tdd-rules/rules/tdd-strategy-selection.md
162
144
 
163
145
  ### 6. 【交互引导】确认任务拆解策略
164
146
 
@@ -183,25 +165,26 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
183
165
  > **必须包含**:任务执行拓扑图(DAG)+ 原子任务清单。任务结构字段(TASK-ID / 类型 / 依赖 / 状态 / 描述等)见 `./reference.md`「§7 任务结构」。
184
166
 
185
167
  **当 test-strategy=tdd 时,任务生成规则:**
186
- 1. 将 spec.md 中每个需求项的每个场景拆为一个行为点
187
- 2. 每个行为点生成一对任务:`[TASK-XX-RED-N]` + `[TASK-XX-GREEN-N]`
188
- 3. RED 任务依赖:前置基础设施任务(如脚手架、数据层)
189
- 4. GREEN 任务依赖:对应的 RED 任务
190
- 5. 可选:每 3-5 个行为点后插入一个 `[TASK-XX-REFACTOR]` 任务
191
- 6. 模块末尾可保留一个 `[TASK-XX-VERIFY]` 任务做全量测试验证
192
- 7. 非 TDD 模块(如前端 UI、配置、SQL DDL)不拆红绿,按常规任务处理
193
- 8. RED 任务验收标准必须包含"测试运行失败,且失败原因正确(功能未实现)"
194
- 9. GREEN 任务验收标准必须包含"写最少代码让对应 RED 测试通过",不包含"实现完整功能"。
195
- **⛔ 禁止在 GREEN 任务中捆绑未测试的代码**(如 Controller 接口、Filter、Config 等)。
196
- 如果 GREEN 需要同时修改多个文件才能让测试通过,检查是否测试范围过大或实现范围超出测试要求。
197
- 10. **GREEN 任务范围限制**:每个 GREEN 任务只能实现让对应 RED 测试通过的代码,禁止捆绑未测试的功能。具体规则:
198
- - Service 层 GREEN 只实现当前行为点的 Service 方法逻辑
199
- - Controller 层不捆绑在 Service GREEN 中,必须独立处理
200
- 11. **Controller 层处理策略**(二选一,由 AI 根据项目复杂度判断,必须在 tasks.md §2.0 中声明):
201
- - 策略 A(推荐):为每个 Controller 接口生成 RED 测试(使用 @WebMvcTest),拆为 RED→GREEN 对
202
- - 策略 B:将 Controller 层声明为非 TDD 模块,作为独立接口层任务,依赖对应 Service 完成
203
- - 无论哪种策略,Controller 不得捆绑在 Service GREEN 任务中
204
- 12. **RED 任务必须包含**:测试方法名(`{method}_{state}_{outcome}` 格式)、Given-When-Then 结构描述、输出文件路径、关联 spec 场景编号
168
+
169
+ 核心规则(inline):
170
+ 1. 每个场景拆为一个行为点,每个行为点生成一对 RED+GREEN 任务
171
+ 2. RED 验收标准必须包含"测试运行失败且失败原因正确"
172
+ 3. GREEN 验收标准必须包含"写最少代码让对应 RED 测试通过",禁止捆绑
173
+ 4. GREEN 不得包含未测试的 Controller/Filter/Config
174
+ 5. 非 TDD 模块(前端 UI/配置/SQL DDL)不拆红绿
175
+ 6. Controller 层策略必须在 tasks.md §2.0 中声明(策略 A 或 B)
176
+ 7. ⛔ **GREEN 任务 YAGNI 围栏**:每个 GREEN-N 任务描述末尾必须包含"不提前实现 [后续 RED 行为]"围栏声明。规则详见 `opsx-tdd-rules/rules/green-yagni-fence.md`
177
+
178
+ BEFORE 生成 TDD 任务,必须读取:
179
+ 1. opsx-tdd-core/reference.md §6(DAG 生成规则表)
180
+ 2. opsx-tdd-rules/rules/dag-generation-rules.md(DAG 规则文件)
181
+ 3. opsx-tdd-rules/rules/controller-strategy.md(Controller 策略 A/B)
182
+ 4. opsx-tdd-rules/rules/exception-path-coverage.md(异常路径测试覆盖门禁)
183
+ 读取后确认:"已读取 N 个规则文件"。
184
+
185
+ > 完整 TDD 拆分示例见 opsx-tdd-core/reference.md §4
186
+ > TDD 模块定义见 opsx-tdd-rules/rules/non-tdd-modules.md
187
+ > 任务类型定义见 opsx-tdd-rules/rules/task-type-definitions.md
205
188
 
206
189
  ### 8. 质量红线自检
207
190
 
@@ -36,16 +36,10 @@ description: opsx-task 的阶段强制检查点与自检清单。仅在执行 ta
36
36
 
37
37
  ## §8.1 TDD 合规性自检(仅 test-strategy=tdd 时)
38
38
 
39
- - [ ] **RED 任务有真实断言**:每个 测试-RED 任务的验收标准包含"测试运行失败",而非"断言为空"或"编译通过"
40
- - [ ] **GREEN 任务为行为级粒度**:每个 实现-GREEN 任务只对应一个 RED 测试,不是模块级整体实现
41
- - [ ] **存在红绿循环**:DAG 中存在 RED→GREEN 的循环对,而非 TEST(全部)→IMPL(全部)的批次模式
42
- - [ ] **有 REFACTOR 任务**:每 3-5 个行为点后至少有一个重构任务(可选但推荐)
43
- - [ ] **GREEN 验收为"最少代码"**:验收标准包含"让对应 RED 测试通过",不包含"实现完整功能"
44
- - [ ] **非 TDD 模块已排除**:前端 UI、配置、SQL DDL 等不拆红绿循环
45
- - [ ] **GREEN 任务无捆绑**:每个 GREEN 任务的输出文件不包含未测试的 Controller/Filter/Config(除非该 GREEN 对应的 RED 测试明确测试了这些组件)
46
- - [ ] **Controller 层策略已声明**:tasks.md §2.0 中明确声明 Controller 层使用策略 A(拆 RED→GREEN)还是策略 B(非 TDD 任务)
47
- - [ ] **RED 任务有测试方法名**:每个 RED 任务包含 `{method}_{state}_{outcome}` 格式的测试方法名
48
- - [ ] **REFACTOR 有具体方向**:每个 REFACTOR 任务列出至少 2 个具体重构点
39
+ 执行 `opsx-tdd-core/checklist.md` §B(10 项)逐项检查。
40
+
41
+ > 不在此内联复制,以 opsx-tdd-core/checklist.md §B 为唯一真相源。
42
+ > 额外补充:还需检查 `opsx-tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)——每个 orElseThrow/边界检查须有对应 RED 任务。
49
43
 
50
44
  ---
51
45