kld-sdd 2.6.0 → 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 (66) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/skywalk-sdd/index.cjs +1 -1
  4. package/skywalk-sdd/ontology/id.cjs +16 -19
  5. package/templates/openspec/proposal.md +1 -1
  6. package/templates/skills/kld-sdd/opsx-apply/SKILL.md +35 -5
  7. package/templates/skills/kld-sdd/opsx-apply/checklist.md +43 -9
  8. package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +50 -3
  9. package/templates/skills/kld-sdd/opsx-apply/reference.md +13 -18
  10. package/templates/skills/kld-sdd/opsx-check/SKILL.md +16 -4
  11. package/templates/skills/kld-sdd/opsx-check/checklist.md +11 -1
  12. package/templates/skills/kld-sdd/opsx-design/SKILL.md +2 -0
  13. package/templates/skills/kld-sdd/opsx-design/checklist.md +1 -0
  14. package/templates/skills/kld-sdd/opsx-propose/reference.md +8 -16
  15. package/templates/skills/kld-sdd/opsx-rules/reference.md +1 -1
  16. package/templates/skills/kld-sdd/opsx-spec/SKILL.md +2 -0
  17. package/templates/skills/kld-sdd/opsx-task/SKILL.md +41 -25
  18. package/templates/skills/kld-sdd/opsx-task/checklist.md +9 -0
  19. package/templates/skills/kld-sdd/opsx-task/reference.md +79 -2
  20. package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/SKILL.md +79 -0
  21. package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/reference.md +203 -0
  22. package/templates/skills/kld-sdd/opsx-tdd-core/SKILL.md +167 -0
  23. package/templates/skills/kld-sdd/opsx-tdd-core/checklist.md +55 -0
  24. package/templates/skills/kld-sdd/opsx-tdd-core/reference.md +146 -0
  25. package/templates/skills/kld-sdd/opsx-tdd-metrics/SKILL.md +73 -0
  26. package/templates/skills/kld-sdd/opsx-tdd-metrics/checklist.md +60 -0
  27. package/templates/skills/kld-sdd/opsx-tdd-quality/SKILL.md +95 -0
  28. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/cause-effect-clarity.md +19 -0
  29. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/clean-test-data.md +33 -0
  30. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/existing-test-awareness.md +17 -0
  31. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/given-when-then.md +44 -0
  32. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/good-test-qualities.md +32 -0
  33. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/mock-boundary.md +44 -0
  34. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/naming-conventions.md +37 -0
  35. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/no-logic-in-tests.md +30 -0
  36. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/one-test-one-scenario.md +23 -0
  37. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/parameterized-testing.md +56 -0
  38. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/prefer-public-apis.md +17 -0
  39. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/general/test-behaviors-not-methods.md +26 -0
  40. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/argument-matching.md +38 -0
  41. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/controller-test-rules.md +37 -0
  42. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/domain-service-rules.md +33 -0
  43. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/java-test-template.md +42 -0
  44. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/json-serialization.md +34 -0
  45. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/java/logging-rules.md +35 -0
  46. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/post-generation/compilation-verification.md +25 -0
  47. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/post-generation/execution-verification.md +28 -0
  48. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/python/py-test-template.md +40 -0
  49. package/templates/skills/kld-sdd/opsx-tdd-quality/rules/typescript/ts-test-template.md +45 -0
  50. package/templates/skills/kld-sdd/opsx-tdd-review/SKILL.md +66 -0
  51. package/templates/skills/kld-sdd/opsx-tdd-review/checklist.md +39 -0
  52. package/templates/skills/kld-sdd/opsx-tdd-rules/SKILL.md +29 -0
  53. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/controller-strategy.md +32 -0
  54. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/dag-generation-rules.md +20 -0
  55. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/des-step-annotation.md +36 -0
  56. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/exception-path-coverage.md +47 -0
  57. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/green-scope-declaration.md +45 -0
  58. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/green-yagni-fence.md +41 -0
  59. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/multi-validation-split.md +36 -0
  60. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/non-tdd-modules.md +17 -0
  61. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/refactor-checklist.md +45 -0
  62. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/task-type-definitions.md +23 -0
  63. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/tdd-strategy-selection.md +13 -0
  64. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-execution-gate.md +25 -0
  65. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +19 -0
  66. package/templates/skills/kld-sdd/opsx-test/SKILL.md +18 -0
package/README.md CHANGED
@@ -32,8 +32,8 @@ Entity sourcedFrom SEC
32
32
  每个本体实体使用双层身份:
33
33
 
34
34
  - `anchor`:`STMT-ORDER-005` 等人工可读编号,跨迭代保持稳定且删除后不复用。
35
- - `entity-id`:全局唯一 UUIDv7,同一逻辑实体跨迭代复用。
36
- - `version-id`:全局唯一 UUIDv7,每次 added/modified/removed 产生新版本;unchanged 复用历史版本。
35
+ - `entity-id`:全局唯一 32 位 ID(8 位十六进制),同一逻辑实体跨迭代复用。
36
+ - `version-id`:全局唯一 32 位 ID,每次 added/modified/removed 产生新版本;unchanged 复用历史版本。
37
37
  - `predecessor-version`:modified/removed 指向同一实体的直接前序版本。
38
38
 
39
39
  UUID 由本地命令生成,不依赖网络、机器号或中央 ID 服务:
@@ -53,7 +53,7 @@ node skywalk-sdd/log.cjs semantic-identity --delta-state=unchanged --entity-id=<
53
53
  本地命令:
54
54
 
55
55
  ```bash
56
- # 解析与诊断;首次运行会为 Artifact/DocumentSection 分配并持久化结构 UUIDv7 sidecar
56
+ # 解析与诊断;首次运行会为 Artifact/DocumentSection 分配并持久化 32 位结构 ID sidecar
57
57
  node skywalk-sdd/log.cjs semantic-scan --project=. --change=<name>
58
58
 
59
59
  # 文件与工作态本体实例全量对账
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kld-sdd",
3
- "version": "2.6.0",
3
+ "version": "2.6.2",
4
4
  "description": "KLD SDD OpenSpec 项目初始化工具 - 一键部署 SDD skills",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -4686,7 +4686,7 @@ SDD Telemetry CLI - 流程度量采集工具
4686
4686
  tasks-status 扫描 Full/Simple 模式 tasks.md 勾选状态
4687
4687
  check-task 扫描变更目录 tasks.md 并勾选指定 task_id
4688
4688
  archive-docs 将 Simple/Full spec 变更真实移动到 openspec/changes/archive/,并可结束 archive 阶段生成报告
4689
- semantic-identity 生成或复用实体/版本 UUID;无需网络和中央 ID 服务
4689
+ semantic-identity 生成或复用实体/版本 ID(8 位十六进制);无需网络和中央 ID 服务
4690
4690
  semantic-scan 只读解析并校验当前 Change
4691
4691
  semantic-reconcile 全量对账文件与本地工作态本体实例
4692
4692
  semantic-check 全量对账并在通过时标记 pending
@@ -3,6 +3,9 @@
3
3
  const crypto = require('crypto');
4
4
  const { ID_PREFIX_TYPES, entityTypeForId } = require('./schema.cjs');
5
5
 
6
+ const ID_BYTE_LENGTH = 4;
7
+ const ID_HEX_LENGTH = ID_BYTE_LENGTH * 2;
8
+
6
9
  function normalizeSlug(value) {
7
10
  const raw = String(value || '').trim();
8
11
  const ascii = raw
@@ -48,25 +51,16 @@ function isValidEntityId(entityId, expectedType = '') {
48
51
  return true;
49
52
  }
50
53
 
51
- function generateUuidV7(timestamp = Date.now()) {
52
- const milliseconds = Number(timestamp);
53
- if (!Number.isSafeInteger(milliseconds) || milliseconds < 0 || milliseconds > 0xffffffffffff) {
54
- throw new Error(`UUIDv7 时间戳非法: ${timestamp}`);
55
- }
56
- const bytes = crypto.randomBytes(16);
57
- let value = BigInt(milliseconds);
58
- for (let index = 5; index >= 0; index -= 1) {
59
- bytes[index] = Number(value & 0xffn);
60
- value >>= 8n;
61
- }
62
- bytes[6] = (bytes[6] & 0x0f) | 0x70;
63
- bytes[8] = (bytes[8] & 0x3f) | 0x80;
64
- const hex = bytes.toString('hex');
65
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
54
+ function generateIdentityId() {
55
+ return crypto.randomBytes(ID_BYTE_LENGTH).toString('hex');
56
+ }
57
+
58
+ function generateUuidV7() {
59
+ return generateIdentityId();
66
60
  }
67
61
 
68
62
  function isValidUuid(value) {
69
- return /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(value || '').trim());
63
+ return new RegExp(`^[0-9a-f]{${ID_HEX_LENGTH}}$`).test(String(value || '').trim().toLowerCase());
70
64
  }
71
65
 
72
66
  const isValidUuidV7 = isValidUuid;
@@ -84,8 +78,8 @@ function allocateIdentity(options = {}) {
84
78
  }
85
79
  if (deltaState === 'added') {
86
80
  return {
87
- entity_id: generateUuidV7(),
88
- version_id: generateUuidV7(),
81
+ entity_id: generateIdentityId(),
82
+ version_id: generateIdentityId(),
89
83
  predecessor_version_id: null,
90
84
  delta_state: deltaState,
91
85
  };
@@ -109,16 +103,19 @@ function allocateIdentity(options = {}) {
109
103
  }
110
104
  return {
111
105
  entity_id: entityId,
112
- version_id: generateUuidV7(),
106
+ version_id: generateIdentityId(),
113
107
  predecessor_version_id: predecessorVersionId,
114
108
  delta_state: deltaState,
115
109
  };
116
110
  }
117
111
 
118
112
  module.exports = {
113
+ ID_BYTE_LENGTH,
114
+ ID_HEX_LENGTH,
119
115
  normalizeSlug,
120
116
  nextEntityId,
121
117
  isValidEntityId,
118
+ generateIdentityId,
122
119
  generateUuidV7,
123
120
  isValidUuid,
124
121
  isValidUuidV7,
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # 【用户选择配置 - 由 /opsx:propose 引导填写】
3
3
  change-id: "CHG-<CHANGE-SLUG>" # 创建时生成,后续不得修改
4
- entity-id: "<UUID>" # Change 的全局逻辑实体 UUID,added 时生成
4
+ entity-id: "<8位十六进制ID>" # Change 的全局逻辑实体 ID,added 时生成
5
5
  version-id: "<UUID>" # 本次 Change 版本 UUID
6
6
  delta-state: "added"
7
7
  predecessor-version: "" # added 留空;modified/removed 指向直接前序版本
@@ -191,12 +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
197
- 3. 再进入下一个任务
194
+ **【S2 逐任务红绿节奏】**(test-strategy=tdd 时):
198
195
 
199
- 这确保每个任务都有对应的测试保护,而非最后统一跑测试。
196
+ ⛔ TDD 铁律:NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
197
+ 先写了生产代码?删除它,从测试开始。
198
+
199
+ ⛔ **TDD RED→GREEN 对严格串行,不适用同层并行派发**。即使 DAG 显示同层有多个 RED→GREEN 对,也必须逐对完成:RED-N → GREEN-N → RED-(N+1) → GREEN-(N+1)。禁止一次性编写多个 RED 测试再一次性实现多个 GREEN。
200
+
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. 再进入下一个任务
208
+
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
213
+
214
+ **【S2.1 RED 测试质量标准】**(test-strategy=tdd 时强制):
215
+
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)
221
+
222
+ ⛔ BEFORE 编写 RED 测试,必须读取:
223
+ - opsx-tdd-anti-patterns/SKILL.md §3(RED 阶段 3 种反模式 + 门禁函数)
224
+ 读取后在报告中确认:"已读取 RED 阶段反模式检查表"。
225
+
226
+ > 完整 Mock 边界矩阵见 opsx-tdd-quality/SKILL.md §2
227
+ > 完整 15 种反模式见 opsx-tdd-anti-patterns/SKILL.md §3-§4
200
228
 
201
229
  ### 5f. 【S3 apply 结束前 checkbox 全量自检】
202
230
 
@@ -253,6 +281,8 @@ g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下
253
281
  - **⛔ 编译检查门禁**:每完成一个任务后必须运行编译检查,编译失败禁止标记已完成。
254
282
  - **⛔ 测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry。${HOOK_GATE_DESCRIPTION}
255
283
  - **⛔ 必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式同步。
284
+ - **⛔ task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改。
285
+ - **⛔ TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED。
256
286
  - **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行。
257
287
  - **⛔ Step 0.1 隔离校验必做**:建 worktree / 建议分支名前必须完成 proposal + 跨 cap spec 依赖校验并输出报告。
258
288
  - **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行。
@@ -34,9 +34,41 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
34
34
 
35
35
  ### §5e 测试执行门禁(按 `proposal.md` 的 `test-strategy`)
36
36
 
37
- - [ ] `tdd` → **⛔ 强制执行**:运行相关测试,测试失败禁止继续,必须修复
38
- - [ ] `impl-first` → **⚠️ 警告模式**:运行测试,失败时显示警告但允许继续
39
- - [ ] `none` → **跳过**:不执行测试门禁
37
+ > 测试执行门禁策略见 opsx-tdd-rules/rules/test-execution-gate.md
38
+
39
+ - [ ] `tdd` → ⛔ 强制执行(RED 确认失败、GREEN 确认通过、REFACTOR 全部测试仍绿)
40
+ - [ ] `impl-first` → ⚠️ 警告模式
41
+ - [ ] `none` → 跳过
42
+
43
+ ### §5e.1 TDD 执行合规自检(仅 test-strategy=tdd 时)
44
+
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 项重构检查点)。
49
+
50
+ ### §5e.2 RED 测试质量门禁(仅 test-strategy=tdd 时,RED 任务完成后强制检查)
51
+
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")
61
+
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
40
72
 
41
73
  ### 任务状态实时更新
42
74
 
@@ -45,19 +77,18 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
45
77
  - [ ] 两种格式同步更新,不可遗漏
46
78
  - [ ] 显示进度:`✅ [TASK-ID] 已完成 [N/M]`
47
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 并报告
48
81
 
49
82
  ---
50
83
 
51
84
  ## §6.0 单元测试真实执行自检(`test-strategy` 非 `none`)
52
85
 
53
- - [ ] 在结束 apply 或 §6.1 收尾之前,在项目根或 worktree 内**真实运行**单元测试命令(`npm test` / `pytest` / `go test` 等)
54
- - [ ] 留下可核验 telemetry 证据(任选其一):
55
- - `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
56
- - `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
57
- - 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
86
+ > 单元测试真实执行自检见 opsx-tdd-core/reference.md §9
87
+
88
+ - [ ] 真实运行单元测试命令并留 telemetry 证据
58
89
  - [ ] `tdd`:无测试证据不得结束 apply / 不得 finish worktree
59
90
  - [ ] `impl-first`:实现后必须补跑并记录
60
- - [ ] `none`:跳过本节与 test gate
91
+ - [ ] `none`:跳过
61
92
 
62
93
  ---
63
94
 
@@ -81,7 +112,10 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
81
112
  - [ ] ⛔ **DAG 依赖拦截**:执行任务前必须检查依赖,前置未完成必须拦截
82
113
  - [ ] ⛔ **编译检查门禁**:每完成一个任务后必须运行编译检查,编译失败禁止标记已完成
83
114
  - [ ] ⛔ **测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry,`sdd-apply-test-gate` 校验非占位数据
115
+ - [ ] ⛔ **RED 测试质量门禁**:见 §5e.2(引用 opsx-tdd-quality + opsx-tdd-anti-patterns,不在此内联复制)
84
116
  - [ ] ⛔ **必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式(`- [ ]`→`- [x]` 与 `**状态**: [ ]`→`[x]`)同步
117
+ - [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改
118
+ - [ ] ⛔ **TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED
85
119
  - [ ] **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行
86
120
  - [ ] ⛔ **Step 0.1 隔离校验必做**:建 worktree / 建议分支名前必须完成 proposal + 跨 cap spec 依赖校验并输出报告;未通过不得按 full 并行策略拆 `kld-sdd/<change>/<cap>`
87
121
  - [ ] **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行
@@ -2,6 +2,49 @@
2
2
 
3
3
  在派发实现子代理时使用此模板。每个 DAG 任务由一个独立子代理执行。
4
4
 
5
+ ## TDD 铁律(当 test-strategy=tdd 时生效)
6
+
7
+ NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.
8
+ - 先写了生产代码再写测试?删掉生产代码,从测试开始
9
+ - "太简单不用测" → 如果值得写,就值得测
10
+ - "事后补测一样" → 不一样,TDD 的价值在于测试驱动设计
11
+
12
+ ### 执行 测试-RED 任务
13
+ 1. 读取 spec.md 场景和 design.md 设计
14
+ 2. 编写测试代码:Given-When-Then 结构 + 真实断言
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
+ 读取后在报告中列出已读取的规则文件路径。
25
+
26
+ ### 执行 实现-GREEN 任务
27
+ 1. 读取对应 RED 任务的失败原因
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
37
+
38
+ ### 执行 重构-REFACTOR 任务
39
+ 1. 在所有测试通过的状态下开始
40
+ 2. 优化代码结构(提取方法、消除重复、改善命名)
41
+ 3. 运行**全部测试**:`mvn test`(或项目对应命令)
42
+ 4. 确认所有测试仍通过
43
+ 5. 如果任何测试失败:回退重构,重新尝试
44
+ 6. ⛔ 执行 `opsx-tdd-rules/rules/refactor-checklist.md`(7 项重构检查点)
45
+
46
+ > 完整 REFACTOR 检查点见 opsx-tdd-rules/rules/refactor-checklist.md
47
+
5
48
  ## 派发格式
6
49
 
7
50
  ```
@@ -13,7 +56,7 @@ Agent (general-purpose):
13
56
  ## 当前任务
14
57
 
15
58
  [TASK-ID]: [完整任务描述,从 tasks.md 中提取]
16
- - 类型: [数据层/业务层/接口层/测试]
59
+ - 类型: [数据层/接口层/UI层/测试-RED/实现-GREEN/重构-REFACTOR/测试-验证/配置]
17
60
  - 依赖: [前置任务列表] ✅ 已完成
18
61
  - 层级: [N]
19
62
 
@@ -50,8 +93,11 @@ Agent (general-purpose):
50
93
  2. 遵循 design.md 的设计约定
51
94
  3. 遵循 overview.md 的全局规范
52
95
  4. 保持变更最小化,不超出任务范围
53
- 5. 自我审查(见下方)
54
- 6. 报告结果
96
+ 5. **当任务类型为 测试-RED 时**:编写带真实断言的测试,运行并确认失败,记录失败原因
97
+ 6. **当任务类型为 实现-GREEN 时**:读取对应 RED 的失败原因,按 `opsx-tdd-rules/rules/green-scope-declaration.md` 执行 Scope 声明,仅实现标记为"属于"的步骤,写最少代码让测试通过,不提前实现未要求的功能
98
+ 7. **当任务类型为 重构-REFACTOR 时**:在测试全绿状态下优化代码,运行全部测试确认仍绿
99
+ 8. 自我审查(见下方)
100
+ 9. 报告结果
55
101
 
56
102
  工作目录:[项目根目录]
57
103
 
@@ -93,6 +139,7 @@ Agent (general-purpose):
93
139
  - 是否避免了过度工程(YAGNI)?
94
140
  - 是否只构建了任务要求的内容?
95
141
  - 是否避免了对无关文件的修改?
142
+ - **GREEN 任务 Scope 检查**:生产代码中是否存在未被当前 RED 断言覆盖的逻辑分支?若存在且属于后续 RED 的行为,是否已删除?
96
143
 
97
144
  如果在自我审查中发现问题,先修复再报告。
98
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,20 +349,19 @@ 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`** 时:
352
+ > 单元测试真实执行见 opsx-tdd-core/reference.md §9
353
+
354
+ 当 `test-strategy` 为 `tdd` 或 `impl-first` 时,必须真实运行单元测试并留 telemetry 证据。`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验。
355
+
356
+ ---
357
+
358
+ ## §6.0a 测试反模式检查(TDD 模式下)
359
+
360
+ > 完整 9 种反模式检测见 opsx-tdd-anti-patterns/SKILL.md §3-§4 + reference.md
357
361
 
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 时自动校验;无证据则**阻断**并提示补跑测试。
362
+ RED 阶段就必须检查,不要等到 GREEN 之后才发现测试是假的。
364
363
 
365
- | test-strategy | 行为 |
366
- |---------------|------|
367
- | `tdd` | 无测试证据不得结束 apply / 不得 finish worktree |
368
- | `impl-first` | 同上,实现后必须补跑并记录 |
369
- | `none` | 跳过本节与 test gate |
364
+ > 参照来源:`skill-references/superpowers-tdd/testing-anti-patterns.md`
370
365
 
371
366
  ---
372
367
 
@@ -33,7 +33,7 @@ allowed-tools:
33
33
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
34
34
  > **📊 Telemetry(必做,不得跳过)**
35
35
  > - 阶段开始:`node skywalk-sdd/log.cjs start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
36
- > - 检查报告生成后,必须先记录结构化检查结果:`node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
36
+ > - 检查报告生成后,必须先记录结构化检查结果:`node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
37
37
  > - `check_result` 记录成功后,才允许阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="摘要"`
38
38
  > - **【B1 摘要数字校验】** `stage_end --summary` 中的数字(如「N 个场景」「N 层 DAG」「N 个任务」)必须与 `spec.md`/`tasks.md`/`test-scenarios.md` 的实统计交叉校验一致后再填写,不得凭记忆自填。典型失真:summary 写「11 个场景」实际 spec 含 13 条断言、「5 层 DAG」实际 tasks 修复后为 6 层。check 阶段发现不一致时,修正 summary 或补齐文档,使三者数字自洽。
39
39
 
@@ -45,7 +45,7 @@ allowed-tools:
45
45
  |------|------|
46
46
  | 核心问题 | 文档链质量是否达标 |
47
47
  | 关键输出 | 检查报告(通过/警告/失败) |
48
- | 检查维度 | 完整性、一致性、算法正确性、可执行性 |
48
+ | 检查维度 | 完整性、一致性、算法正确性、可执行性、TDD合规性(仅test-strategy=tdd时) |
49
49
  | 上游依赖 | proposal → specs → design → tasks 全文档链 |
50
50
 
51
51
  ---
@@ -81,7 +81,7 @@ openspec list
81
81
  | 代码文件 | 验证 design 可行性、锚点准确性 | 可执行性 |
82
82
  | 算法文档 | 验证算法设计正确性 | 算法正确性 |
83
83
 
84
- ### 4. 执行四维质量检查
84
+ ### 4. 执行五维质量检查
85
85
 
86
86
  #### 4.1 完整性检查
87
87
 
@@ -111,6 +111,17 @@ openspec list
111
111
  - [ ] 所有外部依赖已明确状态
112
112
  - [ ] 代码锚点存在且可访问
113
113
 
114
+ #### 4.4a TDD 合规性检查(仅 test-strategy=tdd 时执行)
115
+
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
+ 读取后确认:"已读取测试质量审查清单"。
124
+
114
125
  #### 4.5 任务完成状态检查(实现后 / 归档前)
115
126
 
116
127
  `task` 阶段允许 `tasks.md` 出现未完成项;这只是计划状态。但如果当前变更已经进入 apply 之后,或本次 check 发现实现代码、测试报告、`build_result/test_result/task_update/conformance_review` 等实施证据,必须检查任务勾选状态:
@@ -135,6 +146,7 @@ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
135
146
  > | 一致性 | ✅/⚠️/❌ | [具体问题] |
136
147
  > | 算法正确性 | ✅/⚠️/❌ | [具体问题] |
137
148
  > | 可执行性 | ✅/⚠️/❌ | [具体问题] |
149
+ > | TDD合规性 | ✅/⚠️/❌/— | [仅test-strategy=tdd时检查] |
138
150
  >
139
151
  > **总体结果**:✅ 通过 / ⚠️ 有警告 / ❌ 未通过
140
152
  >
@@ -158,7 +170,7 @@ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
158
170
 
159
171
  在终端执行(必须成功):
160
172
  ```bash
161
- node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
173
+ node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
162
174
  ```
163
175
 
164
176
  > **⚠️ P1-1 check_result details 不得为空**:`--details-json` 必须含 `consistency_score` / `categories` / `task_completion` 等字段,**禁止传空对象 `{}`**。空 details 会导致 report 的 Q5 跨文档一致性得分、P4b 修复率为 null(工具侧虽有 state fallback 兜底,但事件 details 是主数据源)。
@@ -33,7 +33,17 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
33
33
 
34
34
  ## D. 检查报告四维
35
35
 
36
- - [ ] 完整性、一致性、算法正确性、可执行性四维均已输出
36
+ - [ ] 完整性、一致性、算法正确性、可执行性、TDD合规性(仅test-strategy=tdd时)五维均已输出
37
37
  - [ ] 报告问题对应修复建议(spec/design/task)
38
+
39
+ ## E. TDD 合规性检查(仅 test-strategy=tdd 时)
40
+
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`(异常路径覆盖门禁)。
45
+
46
+ ## F. 语义门禁与工作态
47
+
38
48
  - [ ] `openspec/changes/<变更名称>/artifact-index.json` 已覆盖当前全部 proposal/spec/design/tasks,且每份 `artifacts/*.ontology.json` 与 `working-ontology.json` revision 一致
39
49
  - [ ] 全部语义门禁通过时工作态 JSON 已从 draft 刷新为 pending;check 未修改任何 Markdown 原文
@@ -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,23 +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: 测试骨架 → 实现代码 → 测试验证
62
- > - 适合:核心业务逻辑、质量要求高
63
- >
64
- > **B) 实现优先 (Impl-First)** - 代码先行
65
- > - 先生成实现任务,测试作为验证步骤
66
- > - DAG: 实现代码 → 测试验证
67
- > - 适合:UI 层、配置类、快速原型
68
- >
69
- > **C) 无测试 (None)** - 仅实现
70
- > - 不生成测试任务,仅编译检查
71
- > - 适合:简单配置、文档更新"
60
+ 使用 **AskUserQuestion** 工具向用户询问(A/B/C 三选一)。
72
61
 
73
62
  根据用户选择:
74
63
  - 选择 A:设置 `test-strategy: tdd`
@@ -77,6 +66,9 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
77
66
 
78
67
  **将用户选择记录到 proposal.md 的 YAML frontmatter 中。**
79
68
 
69
+ > 完整策略定义见 opsx-tdd-core/SKILL.md §5
70
+ > 交互引导文案见 opsx-tdd-rules/rules/tdd-strategy-selection.md
71
+
80
72
  ---
81
73
 
82
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 中**声明来源**: