kld-sdd 2.6.12 → 2.6.14
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.
- package/README.md +29 -7
- package/kld-sdd-guide.html +428 -159
- package/lib/init.js +37 -7
- package/package.json +5 -2
- package/skywalk-sdd/index.cjs +2668 -415
- package/skywalk-sdd/metrics-v3.cjs +1153 -0
- package/skywalk-sdd/ontology/archive-package.cjs +120 -3
- package/skywalk-sdd/ontology/identity-index.cjs +9 -2
- package/skywalk-sdd/ontology/ontology-paths.cjs +73 -0
- package/skywalk-sdd/ontology/resolve-spec-root.cjs +20 -80
- package/skywalk-sdd/ontology/runtime.cjs +32 -22
- package/skywalk-sdd/ontology/structural-identity.cjs +11 -2
- package/skywalk-sdd/ontology/traceability-validator.cjs +16 -8
- package/skywalk-sdd/ontology/working-artifacts.cjs +4 -2
- package/skywalk-sdd/reporting/change-report-model.cjs +309 -0
- package/skywalk-sdd/reporting/change-report-renderer.cjs +425 -0
- package/skywalk-sdd/runtime-metadata.cjs +21 -0
- package/templates/hooks/claude/hooks/sdd-apply-test-gate.cjs +39 -9
- package/templates/hooks/claude/hooks/sdd-post-tool.cjs +87 -8
- package/templates/hooks/claude/hooks/sdd-prompt.cjs +3 -1
- package/templates/hooks/codebuddy/hooks/sdd-apply-test-gate.cjs +39 -9
- package/templates/hooks/codebuddy/hooks/sdd-post-tool.cjs +87 -9
- package/templates/hooks/codebuddy/hooks/sdd-prompt.cjs +3 -1
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +14 -13
- package/templates/skills/kld-sdd/opsx-apply/checklist.md +20 -20
- package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +12 -12
- package/templates/skills/kld-sdd/opsx-apply/reference.md +32 -31
- package/templates/skills/kld-sdd/opsx-archive/SKILL.md +44 -6
- package/templates/skills/kld-sdd/opsx-archive/checklist.md +5 -2
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +21 -13
- package/templates/skills/kld-sdd/opsx-check/checklist.md +8 -7
- package/templates/skills/kld-sdd/opsx-design/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-design/checklist.md +1 -1
- package/templates/skills/kld-sdd/opsx-kb-ingest/SKILL.md +14 -0
- package/templates/skills/kld-sdd/opsx-ontology-query/SKILL.md +31 -0
- package/templates/skills/kld-sdd/opsx-propose/SKILL.md +12 -4
- package/templates/skills/kld-sdd/opsx-propose/reference.md +29 -3
- package/templates/skills/kld-sdd/opsx-rules/reference.md +3 -1
- package/templates/skills/kld-sdd/opsx-spec/SKILL.md +2 -2
- package/templates/skills/kld-sdd/opsx-spec/checklist.md +1 -1
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +10 -10
- package/templates/skills/kld-sdd/opsx-task/checklist.md +3 -3
- package/templates/skills/kld-sdd/opsx-task/reference.md +3 -3
- package/templates/skills/kld-sdd/opsx-test/SKILL.md +7 -5
- package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/SKILL.md +4 -4
- package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/reference.md +4 -4
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/SKILL.md +13 -13
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/checklist.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/reference.md +12 -12
- package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/SKILL.md +3 -3
- package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/checklist.md +2 -2
- package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/SKILL.md +2 -2
- package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/parameterized-testing.md +1 -1
- package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/SKILL.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/checklist.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/SKILL.md +3 -3
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/non-tdd-modules.md +1 -1
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/refactor-checklist.md +1 -1
- package/templates/skills/kld-sdd/tdd-rules/rules/test-skeleton-telemetry.md +19 -0
- package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +0 -19
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/cause-effect-clarity.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/clean-test-data.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/existing-test-awareness.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/given-when-then.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/good-test-qualities.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/mock-boundary.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/naming-conventions.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/no-logic-in-tests.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/one-test-one-scenario.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/prefer-public-apis.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/test-behaviors-not-methods.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/argument-matching.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/controller-test-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/domain-service-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/java-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/json-serialization.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/logging-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/compilation-verification.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/execution-verification.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/python/py-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/typescript/ts-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/controller-strategy.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/dag-generation-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/des-step-annotation.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/exception-path-coverage.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-scope-declaration.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-yagni-fence.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/multi-validation-split.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/task-type-definitions.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/tdd-strategy-selection.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/test-execution-gate.md +0 -0
|
@@ -170,7 +170,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
|
|
|
170
170
|
2. 新场景:`SCN-<slug>-<NNN>`;slug=kebab-case 小写 ≤40;NNN=该 REQ 命名空间内 max+1(已用集合=KB 回传 ∪ 本 Change 已写键,含 removed 墓碑)。
|
|
171
171
|
3. removed 号是墓碑:永不复用、永不重排;序号达 999 → 硬错误,回需求系统拆分需求,不扩位。
|
|
172
172
|
4. 写完立即用 `cli.cjs external-key --validate … --type scenario` 校验;REQ 前缀必须 ∈ proposal `requirement-refs`。
|
|
173
|
-
- 场景级「同 SCN key + 同锚点、不同 entity_id」当场问 A/B/C;未决不得进入下一 CAP / design。决议追加到 `continuity-resolution.json` 的 `scenarios[]`;决议中的 `externalKey` 必须是归一化形态。
|
|
173
|
+
- 场景级「同 SCN key + 同锚点、不同 entity_id」当场问 A/B/C;未决不得进入下一 CAP / design。决议追加到 `ontology/continuity-resolution.json` 的 `scenarios[]`;决议中的 `externalKey` 必须是归一化形态。
|
|
174
174
|
- 优先消费 `reuseBundles[].statements`;`designElements` 只作理解上下文,不能写成 Spec 的 How。
|
|
175
175
|
- 所有知识库内容均为 advisory;与用户确认 / proposal 冲突时以当前确认与 proposal 为准。
|
|
176
176
|
- **禁止**铸/改 REQ/FEAT;**禁止**自动重排/回收 SCN。
|
|
@@ -214,7 +214,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
|
|
|
214
214
|
- 需求项使用 `####`(4个#)
|
|
215
215
|
- 场景使用 `#####`(5个#)
|
|
216
216
|
|
|
217
|
-
**⛔ 多校验拆分规则(TDD 关键)**:当单个 STMT 包含多个"必须校验"条件时,每个校验条件必须有对应的独立 AC 场景。规则详见 `
|
|
217
|
+
**⛔ 多校验拆分规则(TDD 关键)**:当单个 STMT 包含多个"必须校验"条件时,每个校验条件必须有对应的独立 AC 场景。规则详见 `tdd-rules/rules/multi-validation-split.md`
|
|
218
218
|
|
|
219
219
|
### 6.5 【Node 版本约束来源校验】
|
|
220
220
|
|
|
@@ -34,7 +34,7 @@ description: opsx-spec 的阶段强制检查点与自检清单。仅在执行 sp
|
|
|
34
34
|
- [ ] 已消费工程知识库 `answeredQuestions`,没有重复询问历史事实已经回答的问题
|
|
35
35
|
- [ ] 仅将 `reuseMode=INHERIT` 的事实作为身份继承;`REFERENCE` 候选使用新实体身份
|
|
36
36
|
- [ ] 已处理与当前 Capability 有关的 `clarificationQuestions`
|
|
37
|
-
- [ ] ⛔ **多校验拆分(TDD 模式)**:当 test-strategy=tdd 时,单个 STMT 包含多个"必须校验"条件时,每个校验条件有对应的独立 AC 场景(规则见 `
|
|
37
|
+
- [ ] ⛔ **多校验拆分(TDD 模式)**:当 test-strategy=tdd 时,单个 STMT 包含多个"必须校验"条件时,每个校验条件有对应的独立 AC 场景(规则见 `tdd-rules/rules/multi-validation-split.md`)
|
|
38
38
|
|
|
39
39
|
**如有任意一项未满足,重新生成对应章节,直至全部通过。** 自检完成后必须输出结构化自检报告(模板见 `./reference.md`「§7 质量自检报告模板」),未通过项自动修复后重新输出。
|
|
40
40
|
|
|
@@ -150,8 +150,8 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
|
|
|
150
150
|
|
|
151
151
|
**若未设置**:使用 **AskUserQuestion** 工具询问(A/B/C 三选一)
|
|
152
152
|
|
|
153
|
-
> 完整策略定义见
|
|
154
|
-
> 交互引导文案见
|
|
153
|
+
> 完整策略定义见 tdd-core/SKILL.md §5
|
|
154
|
+
> 交互引导文案见 tdd-rules/rules/tdd-strategy-selection.md
|
|
155
155
|
|
|
156
156
|
### 6. 【交互引导】确认任务拆解策略
|
|
157
157
|
|
|
@@ -185,19 +185,19 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
|
|
|
185
185
|
4. GREEN 不得包含未测试的 Controller/Filter/Config
|
|
186
186
|
5. 非 TDD 模块(前端 UI/配置/SQL DDL)不拆红绿
|
|
187
187
|
6. Controller 层策略必须在 tasks.md §2.0 中声明(策略 A 或 B),两种策略都必须生成测试任务
|
|
188
|
-
7. ⛔ **GREEN 任务 YAGNI 围栏**:每个 GREEN-N 任务描述末尾必须包含"不提前实现 [后续 RED 行为]"围栏声明。规则详见 `
|
|
188
|
+
7. ⛔ **GREEN 任务 YAGNI 围栏**:每个 GREEN-N 任务描述末尾必须包含"不提前实现 [后续 RED 行为]"围栏声明。规则详见 `tdd-rules/rules/green-yagni-fence.md`
|
|
189
189
|
8. ⛔ **TDD 模式 DAG 并行标注**:当 `test-strategy=tdd` 时,DAG 拓扑图中每个 RED→GREEN 对必须标注 `⛔ 串行:不可同层并行`。同层存在多个 RED→GREEN 对时,必须在拓扑图中显式注明"本层 RED→GREEN 对须逐对串行执行,禁止并行派发"。非 TDD 模块的同层任务(如 UI/配置/SQL DDL)仍可并行。
|
|
190
190
|
|
|
191
191
|
⛔ BEFORE 生成 TDD 任务,必须读取:
|
|
192
|
-
1.
|
|
193
|
-
2.
|
|
194
|
-
3.
|
|
195
|
-
4.
|
|
192
|
+
1. tdd-core/reference.md §6(DAG 生成规则表)
|
|
193
|
+
2. tdd-rules/rules/dag-generation-rules.md(DAG 规则文件)
|
|
194
|
+
3. tdd-rules/rules/controller-strategy.md(Controller 策略 A/B)
|
|
195
|
+
4. tdd-rules/rules/exception-path-coverage.md(异常路径测试覆盖门禁)
|
|
196
196
|
读取后确认:"已读取 N 个规则文件"。
|
|
197
197
|
|
|
198
|
-
> 完整 TDD 拆分示例见
|
|
199
|
-
> 非 TDD 模块定义见
|
|
200
|
-
> 任务类型定义见
|
|
198
|
+
> 完整 TDD 拆分示例见 tdd-core/reference.md §4
|
|
199
|
+
> 非 TDD 模块定义见 tdd-rules/rules/non-tdd-modules.md
|
|
200
|
+
> 任务类型定义见 tdd-rules/rules/task-type-definitions.md
|
|
201
201
|
|
|
202
202
|
### 8. 质量红线自检
|
|
203
203
|
|
|
@@ -39,10 +39,10 @@ description: opsx-task 的阶段强制检查点与自检清单。仅在执行 ta
|
|
|
39
39
|
|
|
40
40
|
## §8.1 TDD 合规性自检(仅 test-strategy=tdd 时)
|
|
41
41
|
|
|
42
|
-
⛔ 执行 `
|
|
42
|
+
⛔ 执行 `tdd-core/checklist.md` §B(11 项)逐项检查。
|
|
43
43
|
|
|
44
|
-
> 不在此内联复制,以
|
|
45
|
-
> 额外补充:还需检查 `
|
|
44
|
+
> 不在此内联复制,以 tdd-core/checklist.md §B 为唯一真相源。
|
|
45
|
+
> 额外补充:还需检查 `tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)——每个 orElseThrow/边界检查须有对应 RED 任务。
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
@@ -18,7 +18,7 @@ description: opsx-task 的详细模板:telemetry 命令、DAG 生成规则表
|
|
|
18
18
|
|
|
19
19
|
## §6 DAG 生成规则表
|
|
20
20
|
|
|
21
|
-
> 完整规则见 `
|
|
21
|
+
> 完整规则见 `tdd-rules/rules/dag-generation-rules.md`,此处仅保留快速参考。
|
|
22
22
|
|
|
23
23
|
**根据 test-strategy 调整 DAG 生成规则:**
|
|
24
24
|
|
|
@@ -52,7 +52,7 @@ spec.md user-auth 定义了 7 个场景,拆为 7 对 RED+GREEN + 1 个 REFACTO
|
|
|
52
52
|
| TASK-05-GREEN-6 | 登出实现 | 实现-GREEN | TASK-05-RED-6 | 让 RED-6 通过。仅实现当前 RED 测试覆盖的行为路径,不提前实现后续 capability 的功能。 |
|
|
53
53
|
| TASK-05-REFACTOR | 重构优化 | 重构-REFACTOR | TASK-05-GREEN-6 | 所有测试仍绿,代码清理 |
|
|
54
54
|
|
|
55
|
-
> GREEN 任务的 YAGNI 围栏生成规则详见 `
|
|
55
|
+
> GREEN 任务的 YAGNI 围栏生成规则详见 `tdd-rules/rules/green-yagni-fence.md`
|
|
56
56
|
|
|
57
57
|
**关键区别**:
|
|
58
58
|
- 每个 RED 任务都带**真实断言**,跑起来确实失败
|
|
@@ -86,7 +86,7 @@ spec.md user-auth 定义了 7 个场景,拆为 7 对 RED+GREEN + 1 个 REFACTO
|
|
|
86
86
|
|
|
87
87
|
## §6.2 非 TDD 模块处理规则
|
|
88
88
|
|
|
89
|
-
> 完整规则见 `
|
|
89
|
+
> 完整规则见 `tdd-rules/rules/non-tdd-modules.md`,此处仅保留快速参考。
|
|
90
90
|
|
|
91
91
|
以下模块不需要红绿循环,按常规任务处理:
|
|
92
92
|
- 前端 UI 页面(Vue 组件)→ UI层任务
|
|
@@ -105,13 +105,15 @@ allowed-tools:
|
|
|
105
105
|
|
|
106
106
|
### 4a. 【M3 Telemetry】记录测试结果
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
每一次真实测试执行只记录一条 `test_result`,不得把同一次命令的结果复制到多个任务,也不得用估算值补齐用例数。测试执行完成后,在 stage_end 之前记录:
|
|
109
109
|
|
|
110
110
|
```bash
|
|
111
|
-
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=test_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="
|
|
111
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=test_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --task-id=<首个TASK-ID> --run-id=<本次真实执行的稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="<人能看懂的测试结论>" --details-json="{\"test_results\":{\"snapshot_kind\":\"final\",\"verified_task_ids\":[\"<TASK-ID-1>\",\"<TASK-ID-2>\"],\"tdd_phase\":\"<red|green|refactor|regression|not-applicable>\",\"command\":\"<实际测试命令>\",\"exit_code\":<退出码>,\"counts_known\":<true|false>,\"passed\":<counts_known=true时填写>,\"failed\":<counts_known=true时填写>,\"skipped\":<counts_known=true时填写>,\"duration_ms\":<实测毫秒>,\"failure_type\":\"<assertion|contract|compile|infrastructure|timeout|none>\",\"expected_failure\":<仅RED预期失败时true>}}"
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
`run_id` 在同一次执行重试写入时必须保持不变:相同内容会幂等跳过,不同内容会被判为冲突。`counts_known=false` 时省略 `passed/failed/skipped`,绝不写虚构的 `0`。RED 只有在 `expected_failure=true`、退出码非 0 且失败类型为 `assertion` 或 `contract` 时才是有效 RED;基础设施或编译错误不算。
|
|
115
|
+
|
|
116
|
+
此事件供任务完成证据和最终报告采集。最终回归必须写 `snapshot_kind:"final"`;一次执行覆盖多个任务时用去重的 `verified_task_ids`,仍只写一条事件。后续 `task_update` 只引用本事件返回的 `event_id`,不再内嵌或复制测试计数。
|
|
115
117
|
|
|
116
118
|
> **⚠️ P1-4 coverage 不得为 null**:`test_results.coverage` 必须填实测覆盖率数值(跑了 `--coverage` 就填数值,如 `86.5`);未跑 `--coverage` 时填字符串 `"not-run"` 并在 summary 说明原因。**禁止填 `null`**。若 `proposal.md` 含"覆盖率 ≥ X%"验收标准,强制使用 `--coverage` 运行测试。
|
|
117
119
|
|
|
@@ -148,8 +150,8 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=test_result --com
|
|
|
148
150
|
- [ ] 无"生产类中加测试专用方法"
|
|
149
151
|
- [ ] 无"不理解依赖就 mock"
|
|
150
152
|
|
|
151
|
-
> 完整 12 项反模式检测见
|
|
152
|
-
> TDD 报告模式见
|
|
153
|
+
> 完整 12 项反模式检测见 tdd-anti-patterns/SKILL.md §4
|
|
154
|
+
> TDD 报告模式见 tdd-review/SKILL.md §3
|
|
153
155
|
|
|
154
156
|
### 6. 【交互引导】根据结果引导下一步
|
|
155
157
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-anti-patterns
|
|
3
3
|
description: "测试反模式防护层 — 16 种反模式检测(RED 阶段 3 种 + GREEN 后 13 种),每种带门禁函数和修复方案。当编写或审查测试代码时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-anti-patterns — 反模式防护层
|
|
7
7
|
|
|
8
8
|
> **定位**:测试反模式的系统化检测,RED 阶段 + GREEN 后双重检查。
|
|
9
9
|
> **参考来源**:Superpowers `testing-anti-patterns.md`
|
|
@@ -47,8 +47,8 @@ description: "测试反模式防护层 — 16 种反模式检测(RED 阶段 3
|
|
|
47
47
|
| 12 | **测试代码重复** | 大量 copy-paste 的测试代码,缺少 helper 提取 | 提取 test fixture builder 或 helper 方法 |
|
|
48
48
|
| 13 | **魔法值** | 测试中使用未解释的字面值(如 `assertEquals(42, result)` 无注释说明 42 的含义) | 使用命名常量或注释解释字面值含义 |
|
|
49
49
|
| 14 | **断言不足** | 只断言了部分结果,遗漏了关键属性(如只 assertNotNull 但不 assertEquals 具体值) | 每个测试至少有一个具体值断言(assertEquals),而非仅 assertNotNull |
|
|
50
|
-
| 15 | **缺少负面测试** | 只测试正常路径,不测试错误条件 | 每个方法至少有一个异常路径测试(见 `
|
|
51
|
-
| 16 | **AC 变体覆盖不足** | AC 场景描述含"或"条件(如"缺少 A 或 B 或为空"),但测试只覆盖部分变体 | AC 中每个"或"条件变体必须有对应测试方法(规则见 `
|
|
50
|
+
| 15 | **缺少负面测试** | 只测试正常路径,不测试错误条件 | 每个方法至少有一个异常路径测试(见 `tdd-rules/rules/exception-path-coverage.md`) |
|
|
51
|
+
| 16 | **AC 变体覆盖不足** | AC 场景描述含"或"条件(如"缺少 A 或 B 或为空"),但测试只覆盖部分变体 | AC 中每个"或"条件变体必须有对应测试方法(规则见 `tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖) |
|
|
52
52
|
|
|
53
53
|
## §5 门禁函数
|
|
54
54
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "tdd-anti-patterns 详细参考 — 9 种反模式完整详表 + 修复方案代码示例。仅在需要详细反模式检查时读取。"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# tdd-anti-patterns — 详细参考
|
|
6
6
|
|
|
7
7
|
> 仅在需要详细反模式检查时读取。日常检查见 `SKILL.md`。
|
|
8
8
|
|
|
@@ -193,7 +193,7 @@ assertEquals("user-001", result.getUserId());
|
|
|
193
193
|
|
|
194
194
|
**问题**:只测试正常路径,不测试错误条件。
|
|
195
195
|
|
|
196
|
-
**修复**:每个方法至少有一个异常路径测试。规则见 `
|
|
196
|
+
**修复**:每个方法至少有一个异常路径测试。规则见 `tdd-rules/rules/exception-path-coverage.md`。
|
|
197
197
|
|
|
198
198
|
## 反模式 16:AC 变体覆盖不足
|
|
199
199
|
|
|
@@ -222,7 +222,7 @@ void login_withMissingParams_returns1001() {
|
|
|
222
222
|
@Test void login_withBothMissing_returns1001() { ... }
|
|
223
223
|
```
|
|
224
224
|
|
|
225
|
-
**修复**:AC 中每个"或"条件变体必须有对应测试方法。规则见 `
|
|
225
|
+
**修复**:AC 中每个"或"条件变体必须有对应测试方法。规则见 `tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖。
|
|
226
226
|
|
|
227
227
|
## TDD 如何防止这些反模式
|
|
228
228
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-core
|
|
3
3
|
description: "TDD 流程纪律层 — 铁律、红绿重构循环、执行门禁、合规自检。当 test-strategy=tdd 时,所有 SDD 阶段引用本技能获取 TDD 流程规则。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-core — TDD 流程纪律层
|
|
7
7
|
|
|
8
8
|
> **定位**:TDD 铁律、红绿重构循环定义、执行门禁的唯一真相源。
|
|
9
9
|
> **参考来源**:Superpowers `test-driven-development`
|
|
@@ -81,7 +81,7 @@ RED → Verify RED → 🔴中断声明 → GREEN → Verify GREEN → GREEN Sco
|
|
|
81
81
|
- 此声明强制 agent 在 RED 和 GREEN 之间产生节奏断点,防止从 RED 滑入 GREEN 再滑入下一个行为点
|
|
82
82
|
- **GREEN**:写最简单的代码通过测试
|
|
83
83
|
- 不添加功能、不重构其他代码、不"改进"超出测试范围的内容
|
|
84
|
-
- ⛔ **执行 GREEN Scope 声明**(见 `
|
|
84
|
+
- ⛔ **执行 GREEN Scope 声明**(见 `tdd-rules/rules/green-scope-declaration.md`):
|
|
85
85
|
1. 列出当前 RED 测试的断言清单
|
|
86
86
|
2. 列出 design.md 中本 DES 元素的完整流程步骤
|
|
87
87
|
3. 标记步骤归属(✅ 属于当前 RED / ⛔ 属于后续 RED)
|
|
@@ -126,12 +126,12 @@ RED → Verify RED → 🔴中断声明 → GREEN → Verify GREEN → GREEN Sco
|
|
|
126
126
|
- **REFACTOR**:仅在绿色之后
|
|
127
127
|
- 移除重复、改善命名、提取辅助函数
|
|
128
128
|
- 保持测试绿色,不添加行为
|
|
129
|
-
- ⛔ 执行 `
|
|
129
|
+
- ⛔ 执行 `tdd-rules/rules/refactor-checklist.md`(7 项重构检查点)
|
|
130
130
|
- **Repeat**:下一个失败测试,下一个功能
|
|
131
131
|
|
|
132
132
|
## §4 执行门禁
|
|
133
133
|
|
|
134
|
-
> 完整规则见 `
|
|
134
|
+
> 完整规则见 `tdd-rules/rules/test-execution-gate.md`,此处仅保留快速参考。
|
|
135
135
|
|
|
136
136
|
| test-strategy | 行为 |
|
|
137
137
|
|---------------|------|
|
|
@@ -141,7 +141,7 @@ RED → Verify RED → 🔴中断声明 → GREEN → Verify GREEN → GREEN Sco
|
|
|
141
141
|
|
|
142
142
|
## §5 TDD 策略定义
|
|
143
143
|
|
|
144
|
-
> 完整规则见 `
|
|
144
|
+
> 完整规则见 `tdd-rules/rules/tdd-strategy-selection.md`,此处仅保留快速参考。
|
|
145
145
|
|
|
146
146
|
三种策略(tdd/impl-first/none)的定义与适用场景:
|
|
147
147
|
|
|
@@ -151,7 +151,7 @@ RED → Verify RED → 🔴中断声明 → GREEN → Verify GREEN → GREEN Sco
|
|
|
151
151
|
|
|
152
152
|
## §6 Controller 层策略
|
|
153
153
|
|
|
154
|
-
> 完整规则见 `
|
|
154
|
+
> 完整规则见 `tdd-rules/rules/controller-strategy.md`,此处仅保留快速参考。
|
|
155
155
|
|
|
156
156
|
⛔ Controller 层**必须**有测试。两种策略的区别在于测试方式,而非"有无测试"。
|
|
157
157
|
|
|
@@ -214,14 +214,14 @@ RED → Verify RED → 🔴中断声明 → GREEN → Verify GREEN → GREEN Sco
|
|
|
214
214
|
|
|
215
215
|
## §10 跨技能引用
|
|
216
216
|
|
|
217
|
-
- → `
|
|
218
|
-
- → `
|
|
219
|
-
- → `
|
|
220
|
-
- → `
|
|
221
|
-
- → `
|
|
217
|
+
- → `tdd-quality`:单测代码质量标准(Mock 边界矩阵、命名规范、Java 规则等)
|
|
218
|
+
- → `tdd-anti-patterns`:测试反模式检测(15 种反模式 + 门禁函数)
|
|
219
|
+
- → `tdd-review`:测试审查(8 项质量检查 + 缺失测试检测)
|
|
220
|
+
- → `tdd-metrics`:度量分析(隔离评分、命名评分、覆盖率缺口)
|
|
221
|
+
- → `tdd-rules`:规则库(DAG 规则、Controller 策略、telemetry 模板等)
|
|
222
222
|
- `rules/green-yagni-fence.md`:GREEN 任务 YAGNI 围栏(引用方:opsx-task)
|
|
223
223
|
- `rules/green-scope-declaration.md`:GREEN Scope 声明(引用方:opsx-apply)
|
|
224
224
|
- `rules/des-step-annotation.md`:DES 步骤级标注(引用方:opsx-design)
|
|
225
225
|
- `rules/multi-validation-split.md`:多校验拆分(引用方:opsx-spec)
|
|
226
226
|
- `rules/exception-path-coverage.md`:异常路径测试覆盖门禁(引用方:opsx-task, opsx-apply, opsx-check)
|
|
227
|
-
- `rules/refactor-checklist.md`:REFACTOR 阶段检查点(引用方:opsx-apply,
|
|
227
|
+
- `rules/refactor-checklist.md`:REFACTOR 阶段检查点(引用方:opsx-apply, tdd-core)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "tdd-core 自检清单 — TDD 执行合规自检、合规性检查、完成验证。仅在执行 TDD 任务自检时读取。"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# tdd-core — 自检清单
|
|
6
6
|
|
|
7
7
|
> 仅在执行 TDD 任务自检时读取。日常流程见 `SKILL.md`。
|
|
8
8
|
|
|
@@ -18,7 +18,7 @@ description: "opsx-tdd-core 自检清单 — TDD 执行合规自检、合规性
|
|
|
18
18
|
- [ ] ⛔ **RED→GREEN 中断声明已执行**:RED 确认失败后,显式声明了"🔴 RED-N 确认失败,现在进入 GREEN-N"
|
|
19
19
|
- [ ] GREEN 任务已运行测试确认通过
|
|
20
20
|
- [ ] GREEN 未提前实现没有测试要求的功能
|
|
21
|
-
- [ ] ⛔ **GREEN Scope 越界检测**:GREEN 实现后检查生产代码是否包含未被当前 RED 断言覆盖的逻辑分支(规则见 `
|
|
21
|
+
- [ ] ⛔ **GREEN Scope 越界检测**:GREEN 实现后检查生产代码是否包含未被当前 RED 断言覆盖的逻辑分支(规则见 `tdd-rules/rules/green-scope-declaration.md` §Scope 自检)
|
|
22
22
|
- [ ] ⛔ **GREEN YAGNI 围栏逐条确认**:读取 tasks.md 中本 GREEN 任务的 YAGNI 围栏声明,逐条确认"未实现 [后续 RED 的行为]:✅"
|
|
23
23
|
- [ ] ⛔ **GREEN Scope 门禁已执行**:Verify GREEN 之后,检查生产代码无越界逻辑分支
|
|
24
24
|
- [ ] REFACTOR 后全部测试仍绿
|
|
@@ -42,7 +42,7 @@ description: "opsx-tdd-core 自检清单 — TDD 执行合规自检、合规性
|
|
|
42
42
|
- [ ] 每个 REFACTOR 任务列出至少 2 个具体重构点
|
|
43
43
|
- [ ] ⛔ **CON 覆盖**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖
|
|
44
44
|
- [ ] ⛔ **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
45
|
-
- [ ] ⛔ **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `
|
|
45
|
+
- [ ] ⛔ **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `tdd-rules/rules/multi-validation-split.md`)
|
|
46
46
|
|
|
47
47
|
## §C 完成验证清单(8 项)
|
|
48
48
|
|
|
@@ -56,6 +56,6 @@ description: "opsx-tdd-core 自检清单 — TDD 执行合规自检、合规性
|
|
|
56
56
|
- [ ] 输出纯净(无错误/警告)
|
|
57
57
|
- [ ] 测试使用真实代码(仅在不可避免时使用 mock)
|
|
58
58
|
- [ ] 边界情况和错误已覆盖
|
|
59
|
-
- [ ] ⛔ **AC "或"条件变体全覆盖**:AC 场景描述含"或"条件时,每个变体都有对应测试方法(引用 `
|
|
59
|
+
- [ ] ⛔ **AC "或"条件变体全覆盖**:AC 场景描述含"或"条件时,每个变体都有对应测试方法(引用 `tdd-rules/rules/multi-validation-split.md`)
|
|
60
60
|
|
|
61
61
|
> Can't check all boxes? You skipped TDD. Start over.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "tdd-core 详细参考 — 执行步骤、拆分示例、DAG 规则、telemetry 模板。仅在需要详细执行指引时读取。"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# tdd-core — 详细参考
|
|
6
6
|
|
|
7
7
|
> 仅在需要详细执行指引时读取。日常流程见 `SKILL.md`。
|
|
8
8
|
|
|
@@ -28,7 +28,7 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
28
28
|
## §2 GREEN 执行步骤
|
|
29
29
|
|
|
30
30
|
1. 读取对应 RED 任务的失败原因
|
|
31
|
-
2. ⛔ **执行 GREEN Scope 声明**(见 `
|
|
31
|
+
2. ⛔ **执行 GREEN Scope 声明**(见 `tdd-rules/rules/green-scope-declaration.md`):
|
|
32
32
|
- 列出当前 RED 测试的断言清单
|
|
33
33
|
- 列出 design.md 中本 DES 元素的完整流程步骤
|
|
34
34
|
- 标记步骤归属(✅ 属于当前 RED / ⛔ 属于后续 RED)
|
|
@@ -50,14 +50,14 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
50
50
|
|
|
51
51
|
## §3 REFACTOR 执行步骤
|
|
52
52
|
|
|
53
|
-
> 完整检查点见 `
|
|
53
|
+
> 完整检查点见 `tdd-rules/rules/refactor-checklist.md`(7 项重构检查 + 跳过条件 + 量化标准)。
|
|
54
54
|
|
|
55
55
|
1. 在所有测试通过的状态下开始
|
|
56
56
|
2. 优化代码结构(提取方法、消除重复、改善命名)
|
|
57
57
|
3. 运行全部测试:`mvn test`(或项目对应命令)
|
|
58
58
|
4. 确认所有测试仍通过
|
|
59
59
|
5. 任何测试失败 → 回退重构,重新尝试
|
|
60
|
-
6. 执行 `
|
|
60
|
+
6. 执行 `tdd-rules/rules/refactor-checklist.md` 的 7 项检查
|
|
61
61
|
|
|
62
62
|
## §4 TDD 拆分示例
|
|
63
63
|
|
|
@@ -98,7 +98,7 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
98
98
|
|
|
99
99
|
## §6 DAG 生成规则
|
|
100
100
|
|
|
101
|
-
> 完整规则见 `
|
|
101
|
+
> 完整规则见 `tdd-rules/rules/dag-generation-rules.md`,此处仅保留快速参考。
|
|
102
102
|
|
|
103
103
|
| test-strategy | DAG 规则 |
|
|
104
104
|
|---------------|---------|
|
|
@@ -108,7 +108,7 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
108
108
|
|
|
109
109
|
## §7 非 TDD 模块规则
|
|
110
110
|
|
|
111
|
-
> 完整规则见 `
|
|
111
|
+
> 完整规则见 `tdd-rules/rules/non-tdd-modules.md`,此处仅保留快速参考。
|
|
112
112
|
|
|
113
113
|
以下模块不需要红绿循环,按常规任务处理:
|
|
114
114
|
- 前端 UI 页面(Vue 组件)→ UI层任务
|
|
@@ -123,13 +123,13 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
123
123
|
**TDD 测试骨架任务**(`task_kind:"test-skeleton"`):
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
|
-
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=
|
|
126
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=test_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --run-id=<真实执行稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="<TASK-ID> TDD 红灯符合预期" --details-json='{"test_results":{"tdd_phase":"red","verified_task_ids":["<TASK-ID>"],"command":"<实际测试命令>","exit_code":<非零退出码>,"counts_known":true,"passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":<实测毫秒>,"failure_type":"assertion","expected_failure":true}}'
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
**实现任务**(不带 `task_kind`):
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
node "$(cat .sdd-spec-root)/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> 完成" --details-json='{"files_changed":[],"
|
|
132
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --run-id=<任务更新稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json='{"files_changed":[],"task_update":{"test_event_id":"<成功的green/refactor测试event_id>","tdd_required":true}}'
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
## §9 单元测试真实执行
|
|
@@ -138,9 +138,9 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=task_update --com
|
|
|
138
138
|
|
|
139
139
|
1. 在结束 apply 或执行收尾之前,必须真实运行单元测试命令
|
|
140
140
|
2. 须留下可核验 telemetry 证据(任选其一):
|
|
141
|
-
- `
|
|
142
|
-
-
|
|
143
|
-
-
|
|
141
|
+
- 严格 `test_result`:包含真实命令、exit code、耗时、`run-id`、TDD phase 和 `verified_task_ids`
|
|
142
|
+
- 或单独运行 `/opsx-test`,写入 `snapshot_kind:"final"` 的严格 `test_result`
|
|
143
|
+
- `task_update` 只引用上述成功测试的 `event_id`,不得内嵌测试计数
|
|
144
144
|
3. `sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验,无证据则阻断
|
|
145
145
|
|
|
146
146
|
| test-strategy | 行为 |
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-metrics
|
|
3
3
|
description: "度量分析层 — 测试质量量化度量:隔离评分、命名评分、测试异味检测、覆盖率缺口分析。当需要量化测试质量时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-metrics — 度量分析层
|
|
7
7
|
|
|
8
8
|
> **定位**:测试质量的量化度量,提供可计算的评分。
|
|
9
9
|
> **参考来源**:tdd-guide `metrics_calculator.py`
|
|
10
|
-
> **引用方式**:**可选引用**。本技能不参与强制流程,仅在需要量化评估测试质量时按需读取。`opsx-check` 和 `opsx-apply` 的强制检查引用 `
|
|
10
|
+
> **引用方式**:**可选引用**。本技能不参与强制流程,仅在需要量化评估测试质量时按需读取。`opsx-check` 和 `opsx-apply` 的强制检查引用 `tdd-core/checklist.md` 和 `tdd-review`,不引用本技能。
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-quality
|
|
3
3
|
description: "单测代码质量层 — Mock 边界矩阵、测试命名规范、Given-When-Then 结构、Java 测试规则等。当编写或审查测试代码时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-quality — 单测代码质量层
|
|
7
7
|
|
|
8
8
|
> **定位**:单元测试代码的质量标准,不涉及流程,只关注"写出来的测试代码本身是否高质量"。
|
|
9
9
|
> **参考来源**:unit-tests-skills(14 通用规则 + 6 Java 规则)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-review
|
|
3
3
|
description: "测试审查层 — 从审查者角度检测'测试通过但没测到关键点'。8 项质量检查 + 缺失测试检测 + 测试异味检测。当审查测试代码时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-review — 测试审查层
|
|
7
7
|
|
|
8
8
|
> **定位**:从审查者角度检测"测试通过但没测到关键点"。
|
|
9
9
|
> **参考来源**:code-reviewer Phase 5 + tdd-guide 测试质量审查
|
|
@@ -45,7 +45,7 @@ description: "测试审查层 — 从审查者角度检测'测试通过但没测
|
|
|
45
45
|
|
|
46
46
|
## §5 测试异味检测
|
|
47
47
|
|
|
48
|
-
> 完整检测信号见 `
|
|
48
|
+
> 完整检测信号见 `tdd-metrics/SKILL.md` §3,此处仅保留快速参考。
|
|
49
49
|
|
|
50
50
|
| 异味 | 检测信号 | 严重程度 |
|
|
51
51
|
|------|---------|---------|
|
|
@@ -84,11 +84,11 @@ Agent (general-purpose):
|
|
|
84
84
|
|
|
85
85
|
## 审查清单
|
|
86
86
|
|
|
87
|
-
执行
|
|
87
|
+
执行 tdd-review/SKILL.md §3(8 项质量审查)+ §4(缺失测试检测)+ §5(测试异味检测)。
|
|
88
88
|
对于 GREEN 任务,额外检查:
|
|
89
89
|
- GREEN Scope: 生产代码中是否有未被当前 RED 断言覆盖的逻辑分支?
|
|
90
90
|
- YAGNI 围栏: 是否提前实现了后续 RED 的行为?
|
|
91
|
-
- 反模式: 执行
|
|
91
|
+
- 反模式: 执行 tdd-anti-patterns/SKILL.md §4(12 种 GREEN 后反模式)
|
|
92
92
|
|
|
93
93
|
## 审查标准
|
|
94
94
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "tdd-review 自检清单 — 测试质量审查 8 项 + 缺失测试检测 + 测试异味检测。仅在审查测试代码时读取。"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# tdd-review — 自检清单
|
|
6
6
|
|
|
7
7
|
> 仅在审查测试代码时读取。日常流程见 `SKILL.md`。
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ description: "opsx-tdd-review 自检清单 — 测试质量审查 8 项 + 缺失
|
|
|
11
11
|
- [ ] 测试是否真正断言了有意义的行为(而非仅 mock 存在)
|
|
12
12
|
- [ ] 测试是否独立隔离(无测试间依赖)
|
|
13
13
|
- [ ] 测试名称是否清晰描述被测内容(符合 `{method}_{state}_{outcome}`)
|
|
14
|
-
- [ ] mock 和 stub 是否正确使用(Mock 边界,不 Mock 行为,见 `
|
|
14
|
+
- [ ] mock 和 stub 是否正确使用(Mock 边界,不 Mock 行为,见 `tdd-quality/SKILL.md` §2)
|
|
15
15
|
- [ ] 无测试间依赖
|
|
16
16
|
- [ ] 无 sleep 或任意等待
|
|
17
17
|
- [ ] 测试了正常路径 + 错误条件 + 边界值 + 空输入
|
|
@@ -19,7 +19,7 @@ description: "opsx-tdd-review 自检清单 — 测试质量审查 8 项 + 缺失
|
|
|
19
19
|
|
|
20
20
|
## §B 缺失测试检测
|
|
21
21
|
|
|
22
|
-
- [ ] 未测试的错误路径(每个 orElseThrow/边界检查有对应测试,见 `
|
|
22
|
+
- [ ] 未测试的错误路径(每个 orElseThrow/边界检查有对应测试,见 `tdd-rules/rules/exception-path-coverage.md`)
|
|
23
23
|
- [ ] 缺失的负面测试用例
|
|
24
24
|
- [ ] 未覆盖的边界条件
|
|
25
25
|
- [ ] bug 修复无回归测试
|
|
@@ -36,4 +36,4 @@ description: "opsx-tdd-review 自检清单 — 测试质量审查 8 项 + 缺失
|
|
|
36
36
|
|
|
37
37
|
## §D 反模式检测
|
|
38
38
|
|
|
39
|
-
- [ ] 已检查 `
|
|
39
|
+
- [ ] 已检查 `tdd-anti-patterns/SKILL.md` §3-§4 的 15 种反模式
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: tdd-rules
|
|
3
3
|
description: "TDD 规则库 — DAG 生成规则、Controller 策略、任务类型定义、telemetry 模板等独立规则文件。当需要具体 TDD 规则文件时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# tdd-rules — 规则库
|
|
7
7
|
|
|
8
8
|
> **定位**:TDD 相关的规则文件集合,供其他技能按需引用。
|
|
9
9
|
> **参考来源**:unit-tests-skills rules/ 目录模式
|
|
@@ -26,4 +26,4 @@ description: "TDD 规则库 — DAG 生成规则、Controller 策略、任务类
|
|
|
26
26
|
| `rules/des-step-annotation.md` | DES 元素步骤级标注规则(TDD 模式下标注 [GREEN-N] 归属) | MEDIUM | opsx-design |
|
|
27
27
|
| `rules/multi-validation-split.md` | 多校验条件拆分规则(每个校验条件须有独立 AC 场景;AC 内"或"条件变体须全覆盖) | MEDIUM | opsx-spec, opsx-task, opsx-check |
|
|
28
28
|
| `rules/exception-path-coverage.md` | 异常路径测试覆盖门禁(每个 orElseThrow/边界检查须有对应 RED 测试) | HIGH | opsx-task, opsx-apply, opsx-check |
|
|
29
|
-
| `rules/refactor-checklist.md` | REFACTOR 阶段检查点(public API 不变、行为保持、重构质量评估) | HIGH | opsx-apply,
|
|
29
|
+
| `rules/refactor-checklist.md` | REFACTOR 阶段检查点(public API 不变、行为保持、重构质量评估) | HIGH | opsx-apply, tdd-core |
|
|
@@ -15,4 +15,4 @@
|
|
|
15
15
|
|
|
16
16
|
Controller 层**不属于**非 TDD 模块。Controller 必须有测试,通过策略 A(TDD 红绿循环)或策略 B(impl-first 接线测试)实现。
|
|
17
17
|
|
|
18
|
-
> Controller 策略选择见 `
|
|
18
|
+
> Controller 策略选择见 `tdd-rules/rules/controller-strategy.md`,必须在 tasks.md §2.0 中声明。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# REFACTOR 阶段检查点
|
|
2
2
|
|
|
3
3
|
> 影响等级:HIGH
|
|
4
|
-
> 引用方:
|
|
4
|
+
> 引用方:tdd-core/reference.md §3(REFACTOR 执行步骤)、opsx-apply/implementer-prompt.md(REFACTOR 任务执行)、opsx-apply/checklist.md(REFACTOR 门禁)
|
|
5
5
|
|
|
6
6
|
## 核心原则
|
|
7
7
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# test-skeleton telemetry 模板
|
|
2
|
+
|
|
3
|
+
> 影响等级:MEDIUM
|
|
4
|
+
|
|
5
|
+
## TDD 测试骨架任务
|
|
6
|
+
|
|
7
|
+
当任务是“测试骨架”时,真实红灯必须单独记录为严格 `test_result`;任务状态事件不得复制测试计数。
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=test_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --run-id=<真实执行稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="<TASK-ID> TDD 红灯符合预期" --details-json='{"test_results":{"tdd_phase":"red","verified_task_ids":["<TASK-ID>"],"command":"<实际测试命令>","exit_code":<非零退出码>,"counts_known":true,"passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":<实测毫秒>,"failure_type":"assertion","expected_failure":true}}'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 实现任务
|
|
14
|
+
|
|
15
|
+
实现任务不带 `task_kind`(默认 implementation),按真实测试结果记录。
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --run-id=<任务更新稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json='{"files_changed":[],"task_update":{"test_event_id":"<成功的green/refactor测试event_id>","tdd_required":true}}'
|
|
19
|
+
```
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# test-skeleton telemetry 模板
|
|
2
|
-
|
|
3
|
-
> 影响等级:MEDIUM
|
|
4
|
-
|
|
5
|
-
## TDD 测试骨架任务
|
|
6
|
-
|
|
7
|
-
当任务是"测试骨架"(仅编写测试用例、实现尚未编写,测试预期失败/红灯)时,`task_update` 必须在 `--details-json` 中带 `"task_kind":"test-skeleton"`,`--result=success`(骨架按 TDD 计划完成即成功),`test_results.failed` 如实记录红灯数。
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
node "$(cat .sdd-spec-root)/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}}'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## 实现任务
|
|
14
|
-
|
|
15
|
-
实现任务不带 `task_kind`(默认 implementation),按真实测试结果记录。
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
node "$(cat .sdd-spec-root)/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> 完成" --details-json='{"files_changed":[],"test_results":{"command":"<实际测试命令>","passed":<通过数>,"failed":0,"skipped":0,"duration_ms":0}}'
|
|
19
|
-
```
|
|
File without changes
|
/package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/clean-test-data.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/given-when-then.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/mock-boundary.md
RENAMED
|
File without changes
|