dev-playbooks-cn 1.2.8 → 1.4.0
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/package.json +1 -1
- package/skills/_shared/references/spec-/347/273/223/346/236/204/346/250/241/346/235/277.md +161 -0
- package/skills/devbooks-archiver/SKILL.md +26 -0
- package/skills/devbooks-code-review/references//344/273/243/347/240/201/350/257/204/345/256/241/346/217/220/347/244/272/350/257/215.md +10 -0
- package/skills/devbooks-coder/SKILL.md +91 -31
- package/skills/devbooks-design-doc/references//350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +14 -4
- package/skills/devbooks-impact-analysis/references//345/275/261/345/223/215/345/210/206/346/236/220/346/217/220/347/244/272/350/257/215.md +17 -0
- package/skills/devbooks-spec-contract/references//350/247/204/346/240/274/345/217/230/346/233/264/346/217/220/347/244/272/350/257/215.md +11 -0
- package/skills/devbooks-test-owner/SKILL.md +97 -35
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/344/273/243/347/240/201/346/217/220/347/244/272/350/257/215.md +15 -1
package/package.json
CHANGED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Spec 结构模板
|
|
2
|
+
|
|
3
|
+
> 本模板定义了 Spec 真理文件的标准结构,确保 Spec 可被验证、可被追溯、可被测试生成。
|
|
4
|
+
|
|
5
|
+
## 文件位置
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
<truth-root>/specs/<capability>/spec.md
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 标准结构
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
---
|
|
15
|
+
# 元信息(必填)
|
|
16
|
+
capability: <能力名称>
|
|
17
|
+
owner: @<负责人>
|
|
18
|
+
last_verified: YYYY-MM-DD
|
|
19
|
+
last_referenced_by: <最后引用的 change-id>
|
|
20
|
+
health: active | stale | deprecated
|
|
21
|
+
freshness_check: monthly | quarterly | on-change
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# <Capability 名称> 规格
|
|
25
|
+
|
|
26
|
+
## Glossary(术语表)
|
|
27
|
+
|
|
28
|
+
> 本能力专属术语,与 `<truth-root>/_meta/glossary.md` 保持一致。
|
|
29
|
+
|
|
30
|
+
| 术语 | 定义 | 约束 |
|
|
31
|
+
|------|------|------|
|
|
32
|
+
| Order | 订单实体 | 必须有至少一个 OrderItem |
|
|
33
|
+
| OrderItem | 订单项 | qty > 0, price >= 0 |
|
|
34
|
+
|
|
35
|
+
## Invariants(不变量)
|
|
36
|
+
|
|
37
|
+
> 必须始终成立的约束,违反即为系统 Bug。
|
|
38
|
+
|
|
39
|
+
| ID | 描述 | 验证方式 |
|
|
40
|
+
|----|------|----------|
|
|
41
|
+
| INV-001 | 订单总额 = SUM(item.price * item.qty) | A(自动测试) |
|
|
42
|
+
| INV-002 | 库存数量 >= 0 | A(自动测试) |
|
|
43
|
+
| INV-003 | 已发货订单不可取消 | A(状态机测试) |
|
|
44
|
+
|
|
45
|
+
## Contracts(契约)
|
|
46
|
+
|
|
47
|
+
### Preconditions(前置条件)
|
|
48
|
+
|
|
49
|
+
| ID | 操作 | 条件 | 违反时行为 |
|
|
50
|
+
|----|------|------|-----------|
|
|
51
|
+
| PRE-001 | 创建订单 | user.isAuthenticated | 返回 401 |
|
|
52
|
+
| PRE-002 | 支付订单 | order.status == 'pending' | 返回 400 |
|
|
53
|
+
|
|
54
|
+
### Postconditions(后置条件)
|
|
55
|
+
|
|
56
|
+
| ID | 操作 | 保证 |
|
|
57
|
+
|----|------|------|
|
|
58
|
+
| POST-001 | 创建订单成功 | 生成唯一 order.id |
|
|
59
|
+
| POST-002 | 支付成功 | inventory.decreased(qty) |
|
|
60
|
+
|
|
61
|
+
## State Machine(状态机)
|
|
62
|
+
|
|
63
|
+
> 如果本能力涉及状态流转,必须定义状态机。
|
|
64
|
+
|
|
65
|
+
### 状态集
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
States: {Created, Paid, Shipped, Done, Cancelled}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 转换规则
|
|
72
|
+
|
|
73
|
+
| 当前状态 | 动作 | 目标状态 | 条件 |
|
|
74
|
+
|----------|------|----------|------|
|
|
75
|
+
| Created | pay | Paid | payment.success |
|
|
76
|
+
| Created | cancel | Cancelled | - |
|
|
77
|
+
| Paid | ship | Shipped | inventory.reserved |
|
|
78
|
+
| Paid | refund | Cancelled | - |
|
|
79
|
+
| Shipped | deliver | Done | - |
|
|
80
|
+
|
|
81
|
+
### 禁止转换
|
|
82
|
+
|
|
83
|
+
| 当前状态 | 动作 | 原因 |
|
|
84
|
+
|----------|------|------|
|
|
85
|
+
| Shipped | cancel | 违反 INV-003 |
|
|
86
|
+
| Done | * | 终态,不可转出 |
|
|
87
|
+
| Cancelled | * | 终态,不可转出 |
|
|
88
|
+
|
|
89
|
+
## Requirements(需求)
|
|
90
|
+
|
|
91
|
+
### REQ-001: <需求标题>
|
|
92
|
+
|
|
93
|
+
**描述**:<一句话描述>
|
|
94
|
+
|
|
95
|
+
**SHALL/SHOULD/MAY**:
|
|
96
|
+
- 系统 **SHALL** ...
|
|
97
|
+
- 系统 **SHOULD** ...
|
|
98
|
+
|
|
99
|
+
**Trace**:AC-001(来自 design.md)
|
|
100
|
+
|
|
101
|
+
#### Scenario: <场景名>
|
|
102
|
+
|
|
103
|
+
- **GIVEN** 用户已登录且购物车非空
|
|
104
|
+
- **WHEN** 用户点击"提交订单"
|
|
105
|
+
- **THEN** 系统创建订单并返回订单 ID
|
|
106
|
+
|
|
107
|
+
**数据实例**(边界条件):
|
|
108
|
+
|
|
109
|
+
| 输入 | 预期输出 | 说明 |
|
|
110
|
+
|------|----------|------|
|
|
111
|
+
| qty=1, price=100 | total=100 | 正常值 |
|
|
112
|
+
| qty=0 | 拒绝 | 边界-零值 |
|
|
113
|
+
| qty=-1 | 拒绝 | 边界-负值 |
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 变更历史
|
|
118
|
+
|
|
119
|
+
| 日期 | 变更包 | 变更内容 |
|
|
120
|
+
|------|--------|----------|
|
|
121
|
+
| 2024-01-16 | 20240116-1030-add-cancel | 新增取消订单场景 |
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 使用指南
|
|
125
|
+
|
|
126
|
+
### 1. 谁来写 Spec?
|
|
127
|
+
|
|
128
|
+
- **spec-contract skill**:负责创建/更新 spec delta
|
|
129
|
+
- **archiver skill**:负责将 spec delta 合并到 truth-root
|
|
130
|
+
|
|
131
|
+
### 2. 谁来读 Spec?
|
|
132
|
+
|
|
133
|
+
| Skill | 读取目的 |
|
|
134
|
+
|-------|----------|
|
|
135
|
+
| design-doc | 检查设计是否与现有 Spec 冲突,引用 REQ-xxx |
|
|
136
|
+
| test-owner | 从契约/状态机生成测试 |
|
|
137
|
+
| impact-analysis | 识别受影响的 Spec |
|
|
138
|
+
| code-review | 检查术语一致性 |
|
|
139
|
+
| archiver | 更新元信息,建立引用链 |
|
|
140
|
+
|
|
141
|
+
### 3. 测试生成映射
|
|
142
|
+
|
|
143
|
+
| Spec 元素 | 生成的测试类型 |
|
|
144
|
+
|-----------|---------------|
|
|
145
|
+
| INV-xxx | 不变量测试 |
|
|
146
|
+
| PRE-xxx | 前置条件测试(满足+违反) |
|
|
147
|
+
| POST-xxx | 后置条件测试 |
|
|
148
|
+
| State Transition | 状态转换测试 |
|
|
149
|
+
| Forbidden Transition | 禁止转换测试 |
|
|
150
|
+
| Data Instance Table | 参数化测试用例 |
|
|
151
|
+
|
|
152
|
+
### 4. 健康度检测
|
|
153
|
+
|
|
154
|
+
Spec 文件的 `health` 字段由 entropy-monitor 自动检测:
|
|
155
|
+
|
|
156
|
+
| 条件 | health 状态 |
|
|
157
|
+
|------|-------------|
|
|
158
|
+
| last_verified < 90 天 | `active` |
|
|
159
|
+
| last_verified > 90 天 | `stale`(需要 review) |
|
|
160
|
+
| 明确标记废弃 | `deprecated` |
|
|
161
|
+
| last_referenced_by 为空超过 6 个月 | 建议删除 |
|
|
@@ -120,6 +120,32 @@ proposal → design → test-owner(P1) → coder → test-owner(P2) → code-rev
|
|
|
120
120
|
| `<change-root>/<change-id>/specs/**` | `<truth-root>/specs/**` | 增量合并 |
|
|
121
121
|
| `<change-root>/<change-id>/contracts/**` | `<truth-root>/contracts/**` | 版本化合并 |
|
|
122
122
|
|
|
123
|
+
**Spec 元信息更新**(合并时必须执行):
|
|
124
|
+
|
|
125
|
+
在合并 spec 到 truth-root 时,必须更新以下元信息:
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
# 在每个被合并/引用的 spec 文件头部更新
|
|
129
|
+
---
|
|
130
|
+
last_referenced_by: <change-id> # 最后引用此 spec 的变更包
|
|
131
|
+
last_verified: <归档日期> # 最后验证日期
|
|
132
|
+
health: active # 健康状态:active | stale | deprecated
|
|
133
|
+
---
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**元信息更新规则**:
|
|
137
|
+
|
|
138
|
+
| 场景 | 更新行为 |
|
|
139
|
+
|------|----------|
|
|
140
|
+
| 新增 Spec | 创建完整元信息头 |
|
|
141
|
+
| 修改已有 Spec | 更新 `last_referenced_by` 和 `last_verified` |
|
|
142
|
+
| Spec 被设计文档引用但未修改 | 仅更新 `last_referenced_by` |
|
|
143
|
+
| 标记为废弃 | 设置 `health: deprecated` |
|
|
144
|
+
|
|
145
|
+
**建立引用追溯链**:
|
|
146
|
+
|
|
147
|
+
归档时,archiver 会自动扫描 design.md 中声明的 "受影响的 Spec"(Affected Specs),并更新这些 Spec 的 `last_referenced_by` 字段,即使它们没有被直接修改。这建立了从 Spec 到变更包的反向追溯链。
|
|
148
|
+
|
|
123
149
|
### 第 4 步:架构合并
|
|
124
150
|
|
|
125
151
|
> **设计决策**:C4 架构变更通过 design.md 的 Architecture Impact 章节记录,由 Archiver 在归档时合并到真理。
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
- 统一语言表(如存在):`<truth-root>/_meta/glossary.md`
|
|
14
14
|
- 高 ROI 坑库(如存在):`<truth-root>/engineering/pitfalls.md`
|
|
15
15
|
|
|
16
|
+
**必须读取的 Spec 真理**(评审前强制检查):
|
|
17
|
+
- `<truth-root>/specs/**`:现有规格文件
|
|
18
|
+
- 目的:验证代码命名/结构是否与 Spec 中定义的术语和契约一致
|
|
19
|
+
|
|
16
20
|
硬约束(必须遵守):
|
|
17
21
|
1) 只输出审查意见与修改建议;不直接改 tests/ 或设计文档。
|
|
18
22
|
2) 不讨论业务逻辑正确性(由测试/规格裁判);只讨论可维护性与工程质量。
|
|
@@ -64,6 +68,12 @@
|
|
|
64
68
|
- 是否存在同一概念在不同模块中使用不同命名?(如 User/Account/Member 混用)
|
|
65
69
|
- Entity 与 ValueObject 的区分是否正确?(Entity 有 ID,VO 无 ID 且不可变)
|
|
66
70
|
|
|
71
|
+
**Spec 真理术语对照**(必须检查):
|
|
72
|
+
- 代码中的命名是否与 `<truth-root>/specs/` 中定义的术语一致?
|
|
73
|
+
- 状态名/枚举值是否与 Spec 中的状态机定义一致?
|
|
74
|
+
- 方法名是否反映 Spec 中的动作/转换?(如 `cancel()` 对应 `order --[cancel]--> cancelled`)
|
|
75
|
+
- 若发现命名不一致,标记为"术语漂移风险"并建议统一
|
|
76
|
+
|
|
67
77
|
---
|
|
68
78
|
|
|
69
79
|
## Invariant 保护(必须检查)
|
|
@@ -14,16 +14,27 @@ allowed-tools:
|
|
|
14
14
|
|
|
15
15
|
## 工作流位置感知(Workflow Position Awareness)
|
|
16
16
|
|
|
17
|
-
> **核心原则**:Coder 在 Test Owner 阶段 1
|
|
17
|
+
> **核心原则**:Coder 在 Test Owner 阶段 1 之后执行,通过**模式标签**(而非会话隔离)实现思维清晰。
|
|
18
18
|
|
|
19
19
|
### 我在整体工作流中的位置
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
proposal → design →
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
proposal → design → [TEST-OWNER] → [CODER] → [TEST-OWNER] → code-review → archive
|
|
23
|
+
↓ ↓
|
|
24
|
+
实现+快轨测试 证据审计+打勾
|
|
25
|
+
(@smoke/@critical) (不重跑@full)
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
### AI 时代个人开发优化
|
|
29
|
+
|
|
30
|
+
> **重要变更**:本协议针对 AI 编程 + 个人开发场景优化,**去掉了"单独会话"的硬性要求**。
|
|
31
|
+
|
|
32
|
+
| 旧设计 | 新设计 | 原因 |
|
|
33
|
+
|--------|--------|------|
|
|
34
|
+
| Test Owner 和 Coder 必须单独会话 | 同一会话,用 `[TEST-OWNER]` / `[CODER]` 模式标签切换 | 减少上下文重建成本 |
|
|
35
|
+
| Coder 跑完整测试等待结果 | Coder 跑快轨(`@smoke`/`@critical`),`@full` 异步触发 | 快速迭代 |
|
|
36
|
+
| 完成后直接交给 Test Owner | 完成后状态为 `Implementation Done`,等 @full 通过 | 异步不阻塞,归档同步 |
|
|
37
|
+
|
|
27
38
|
### Coder 的职责边界
|
|
28
39
|
|
|
29
40
|
| 允许 | 禁止 |
|
|
@@ -31,18 +42,60 @@ proposal → design → test-owner(阶段1) → [Coder] → test-owner(阶段2)
|
|
|
31
42
|
| 修改 `src/**` 代码 | ❌ 修改 `tests/**` |
|
|
32
43
|
| 勾选 `tasks.md` 任务项 | ❌ 修改 `verification.md` |
|
|
33
44
|
| 记录偏离到 `deviation-log.md` | ❌ 勾选 AC 覆盖矩阵 |
|
|
34
|
-
|
|
|
45
|
+
| 运行快轨测试(`@smoke`/`@critical`) | ❌ 设置 verification.md Status 为 Verified/Done |
|
|
46
|
+
| 触发 `@full` 测试(CI/后台) | ❌ 等待 @full 完成(可以开始下一个变更) |
|
|
35
47
|
|
|
36
48
|
### Coder 完成后的流程
|
|
37
49
|
|
|
38
|
-
1.
|
|
39
|
-
2.
|
|
40
|
-
3.
|
|
41
|
-
4.
|
|
42
|
-
|
|
43
|
-
- Test Owner
|
|
50
|
+
1. **快轨测试绿**:`@smoke` + `@critical` 通过
|
|
51
|
+
2. **触发 @full**:提交代码,CI 开始异步运行 @full 测试
|
|
52
|
+
3. **状态变更**:设置变更状态为 `Implementation Done`
|
|
53
|
+
4. **可以开始下一个变更**(不阻塞)
|
|
54
|
+
5. **等待 @full 结果**:
|
|
55
|
+
- @full 通过 → Test Owner 进入阶段 2 审计证据
|
|
56
|
+
- @full 失败 → Coder 修复
|
|
57
|
+
|
|
58
|
+
**关键提醒**:
|
|
59
|
+
- Coder 完成后,状态是 `Implementation Done`,**不是直接进入 Code Review**
|
|
60
|
+
- 开发迭代是异步的(可以开始下一个变更),但归档是同步的(必须等 @full 通过)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 测试分层与运行策略(关键!)
|
|
65
|
+
|
|
66
|
+
> **核心原则**:Coder 只运行快轨测试,@full 测试异步触发,不阻塞开发迭代。
|
|
67
|
+
|
|
68
|
+
### 测试分层标签
|
|
69
|
+
|
|
70
|
+
| 标签 | 用途 | Coder 何时运行 | 预期耗时 |
|
|
71
|
+
|------|------|----------------|----------|
|
|
72
|
+
| `@smoke` | 快速反馈,核心路径 | 每次代码修改后 | 秒级 |
|
|
73
|
+
| `@critical` | 关键功能验证 | 准备提交前 | 分钟级 |
|
|
74
|
+
| `@full` | 完整验收测试 | **不运行**,触发 CI 异步执行 | 可以慢 |
|
|
44
75
|
|
|
45
|
-
|
|
76
|
+
### Coder 的测试运行策略
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 开发过程中:频繁运行 @smoke
|
|
80
|
+
npm test -- --grep "@smoke"
|
|
81
|
+
|
|
82
|
+
# 准备提交前:运行 @critical
|
|
83
|
+
npm test -- --grep "@smoke|@critical"
|
|
84
|
+
|
|
85
|
+
# 提交后:CI 自动运行 @full(Coder 不等待)
|
|
86
|
+
git push # 触发 CI
|
|
87
|
+
# → Coder 可以开始下一个任务
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 异步与同步的边界
|
|
91
|
+
|
|
92
|
+
| 动作 | 阻塞/异步 | 说明 |
|
|
93
|
+
|------|-----------|------|
|
|
94
|
+
| `@smoke` 测试 | 同步 | 每次修改后立即运行 |
|
|
95
|
+
| `@critical` 测试 | 同步 | 提交前必须通过 |
|
|
96
|
+
| `@full` 测试 | **异步** | CI 后台运行,不阻塞 Coder |
|
|
97
|
+
| 开始下一个变更 | **不阻塞** | Coder 可以立即开始 |
|
|
98
|
+
| 归档 | **阻塞** | 必须等 @full 通过 |
|
|
46
99
|
|
|
47
100
|
---
|
|
48
101
|
|
|
@@ -319,26 +372,29 @@ fi
|
|
|
319
372
|
|
|
320
373
|
| 状态码 | 状态 | 判定条件 | 下一步 |
|
|
321
374
|
|:------:|------|----------|--------|
|
|
322
|
-
| ✅ |
|
|
323
|
-
| ⚠️ |
|
|
324
|
-
| 🔄 | HANDOFF | 发现测试问题需要修改 | `
|
|
375
|
+
| ✅ | IMPLEMENTATION_DONE | 快轨测试绿,@full 已触发,无偏离 | 切换到 `[TEST-OWNER]` 等待 @full |
|
|
376
|
+
| ⚠️ | IMPLEMENTATION_DONE_WITH_DEVIATION | 快轨绿,deviation-log 有未回写记录 | `devbooks-design-backport` |
|
|
377
|
+
| 🔄 | HANDOFF | 发现测试问题需要修改 | 切换到 `[TEST-OWNER]` 模式修复测试 |
|
|
325
378
|
| ❌ | BLOCKED | 需要外部输入/决策 | 记录断点,等待用户 |
|
|
326
|
-
| 💥 | FAILED |
|
|
379
|
+
| 💥 | FAILED | 快轨测试未通过 | 修复后重试 |
|
|
327
380
|
|
|
328
381
|
### 状态判定流程
|
|
329
382
|
|
|
330
383
|
```
|
|
331
384
|
1. 检查 deviation-log.md 是否有 "| ❌" 记录
|
|
332
|
-
→ 有:
|
|
385
|
+
→ 有:IMPLEMENTATION_DONE_WITH_DEVIATION
|
|
333
386
|
|
|
334
387
|
2. 检查是否需要修改 tests/
|
|
335
|
-
→ 是:HANDOFF to
|
|
388
|
+
→ 是:HANDOFF to [TEST-OWNER] 模式
|
|
389
|
+
|
|
390
|
+
3. 检查快轨测试(@smoke + @critical)是否全部通过
|
|
391
|
+
→ 否:FAILED
|
|
336
392
|
|
|
337
|
-
|
|
338
|
-
→ 否:BLOCKED
|
|
393
|
+
4. 检查 tasks.md 是否全部完成
|
|
394
|
+
→ 否:BLOCKED 或继续实现
|
|
339
395
|
|
|
340
|
-
|
|
341
|
-
→
|
|
396
|
+
5. 以上都通过,触发 @full
|
|
397
|
+
→ IMPLEMENTATION_DONE
|
|
342
398
|
```
|
|
343
399
|
|
|
344
400
|
### 路由输出模板(必须使用)
|
|
@@ -348,37 +404,41 @@ fi
|
|
|
348
404
|
```markdown
|
|
349
405
|
## 完成状态
|
|
350
406
|
|
|
351
|
-
**状态**:✅
|
|
407
|
+
**状态**:✅ IMPLEMENTATION_DONE / ⚠️ ... / 🔄 HANDOFF / ❌ BLOCKED / 💥 FAILED
|
|
352
408
|
|
|
353
409
|
**任务进度**:X/Y 已完成
|
|
354
410
|
|
|
411
|
+
**快轨测试**:@smoke ✅ / @critical ✅
|
|
412
|
+
|
|
413
|
+
**@full 测试**:已触发(CI 异步运行中)
|
|
414
|
+
|
|
355
415
|
**偏离记录**:有 N 条待回写 / 无
|
|
356
416
|
|
|
357
417
|
## 下一步
|
|
358
418
|
|
|
359
|
-
|
|
419
|
+
**推荐**:切换到 `[TEST-OWNER]` 模式等待 @full / `devbooks-xxx skill`
|
|
360
420
|
|
|
361
421
|
**原因**:[具体原因]
|
|
362
422
|
|
|
363
|
-
|
|
364
|
-
运行 devbooks-xxx skill 处理变更 <change-id>
|
|
423
|
+
**注意**:可以开始下一个变更,不需要等待 @full 完成
|
|
365
424
|
```
|
|
366
425
|
|
|
367
426
|
### 具体路由规则
|
|
368
427
|
|
|
369
428
|
| 我的状态 | 下一步 | 原因 |
|
|
370
429
|
|----------|--------|------|
|
|
371
|
-
|
|
|
372
|
-
|
|
|
373
|
-
| HANDOFF (测试问题) | `
|
|
430
|
+
| IMPLEMENTATION_DONE | 切换到 `[TEST-OWNER]` 模式(等 @full) | 快轨绿,等 @full 通过后审计证据 |
|
|
431
|
+
| IMPLEMENTATION_DONE_WITH_DEVIATION | `devbooks-design-backport` | 先回写设计 |
|
|
432
|
+
| HANDOFF (测试问题) | 切换到 `[TEST-OWNER]` 模式 | Coder 不能修改测试 |
|
|
374
433
|
| BLOCKED | 等待用户 | 记录断点区 |
|
|
375
434
|
| FAILED | 修复后重试 | 分析失败原因 |
|
|
376
435
|
|
|
377
436
|
**关键约束**:
|
|
378
437
|
- Coder **永远不能修改** `tests/**`
|
|
379
|
-
-
|
|
438
|
+
- 如发现测试问题,必须切换到 `[TEST-OWNER]` 模式处理
|
|
380
439
|
- 如有偏离,必须先 design-backport 再继续
|
|
381
|
-
- **Coder
|
|
440
|
+
- **Coder 完成后状态是 `Implementation Done`,必须等 @full 通过后才能进入 Test Owner 阶段 2**
|
|
441
|
+
- **模式切换替代会话隔离**:使用 `[TEST-OWNER]` / `[CODER]` 标签切换模式
|
|
382
442
|
|
|
383
443
|
---
|
|
384
444
|
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
- 聊天记录
|
|
19
19
|
- 统一语言表(如存在):`<truth-root>/_meta/glossary.md`
|
|
20
20
|
|
|
21
|
+
**必须读取的 Spec 真理**(设计前强制检查):
|
|
22
|
+
- `<truth-root>/specs/**`:现有规格文件(REQ/Invariants/Contracts)
|
|
23
|
+
- 目的:确保本次设计不与现有规格冲突,并显式引用受影响的规格
|
|
24
|
+
|
|
21
25
|
任务:
|
|
22
26
|
1) 输出设计文档(不是编码计划、不是代码实现)。
|
|
23
27
|
2) 文档必须达到“可驱动验收、可驱动计划拆解”的颗粒度:清晰边界、契约、红线、验收。
|
|
@@ -181,9 +185,15 @@ Acceptance Criteria 写法要求:
|
|
|
181
185
|
- 不输出实现步骤、PR 切分建议、生产代码具体文件路径与函数体代码
|
|
182
186
|
- 不输出可运行伪代码;如必须描述算法,只写 Inputs/Outputs/Invariants/复杂度上限/降级策略
|
|
183
187
|
|
|
184
|
-
|
|
185
|
-
-
|
|
186
|
-
- 若涉及对外接口/API
|
|
187
|
-
-
|
|
188
|
+
补充要求(用于大型项目的"可追溯性"):
|
|
189
|
+
- 在文档中显式列出本次变更影响的"能力/模块/对外契约"(仅列名称与边界,不写实现)
|
|
190
|
+
- 若涉及对外接口/API/事件/数据结构:必须在"核心数据与事件契约"章节写清楚版本化策略(schema_version、兼容窗口、迁移/回放原则)
|
|
191
|
+
- 若涉及架构边界变化:在"目标架构"章节增加一个 **C4 Delta(可选)** 小节:说明 C1/C2/C3 哪些元素被新增/修改/移除(不要求画完整图;完整图由架构地图维护)
|
|
192
|
+
|
|
193
|
+
**Spec 真理引用要求**(可追溯性核心):
|
|
194
|
+
- **必须声明受影响的现有 Spec**:列出本次设计影响的 `<truth-root>/specs/` 下的规格文件
|
|
195
|
+
- **必须引用 REQ/Invariant**:设计中涉及的每个约束必须追溯到 Spec 中的 REQ-xxx 或 INV-xxx
|
|
196
|
+
- **Gap 声明**:如果本次设计无法满足某个现有 REQ,必须显式声明为 Gap 并说明原因
|
|
197
|
+
- **术语一致性**:设计中使用的领域术语必须与 `<truth-root>/_meta/glossary.md` 一致;如需引入新术语,必须在设计文档中声明并建议添加到 glossary
|
|
188
198
|
|
|
189
199
|
现在开始输出该《设计文档》Markdown,不要输出额外解释。
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
- 当前真理源:`<truth-root>/`
|
|
18
18
|
- 代码库(只读分析)
|
|
19
19
|
|
|
20
|
+
**必须读取的 Spec 真理**(分析前强制检查):
|
|
21
|
+
- `<truth-root>/specs/**`:现有规格文件
|
|
22
|
+
- 目的:识别本次变更影响哪些现有 Specs(REQ/Invariants/Contracts)
|
|
23
|
+
|
|
20
24
|
硬约束(必须遵守):
|
|
21
25
|
- 先影响分析,后写代码
|
|
22
26
|
- 禁止“装饰性/表层重构”(除非直接降低本次改动风险)
|
|
@@ -53,6 +57,19 @@
|
|
|
53
57
|
- 外部系统/API 变更是否被 ACL 隔离?(外部模型变化不应直接传播到内部模型)
|
|
54
58
|
- 是否存在直接调用外部 API 而未经过适配层的代码?
|
|
55
59
|
- 若新增外部依赖:建议的 ACL 接口定义
|
|
60
|
+
- **F. 受影响的 Spec 真理**(必须分析):
|
|
61
|
+
- 列出本次变更影响的 `<truth-root>/specs/` 下的规格文件
|
|
62
|
+
- 对每个受影响 Spec,标注影响类型:
|
|
63
|
+
- `[BREAK]`:破坏现有 REQ/Invariant(需要更新 Spec 或重新设计)
|
|
64
|
+
- `[EXTEND]`:扩展现有能力(需要新增 REQ/Scenario)
|
|
65
|
+
- `[DEPRECATE]`:废弃现有能力(需要标记 Spec 为 deprecated)
|
|
66
|
+
- 输出格式:
|
|
67
|
+
```
|
|
68
|
+
Affected Specs:
|
|
69
|
+
- [EXTEND] specs/order/spec.md - 新增取消订单场景
|
|
70
|
+
- [BREAK] specs/payment/spec.md - INV-002 "已支付不可取消" 需要修改
|
|
71
|
+
- [DEPRECATE] specs/legacy-checkout/spec.md - 整体废弃
|
|
72
|
+
```
|
|
56
73
|
4) 兼容性与风险(Compatibility & Risks)
|
|
57
74
|
- Breaking 变化(如有必须显式标注)
|
|
58
75
|
- 迁移/回滚路径
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
- 项目画像(如存在,优先遵循其中的格式约定):`<truth-root>/_meta/project-profile.md`
|
|
19
19
|
- 统一语言表(如存在):`<truth-root>/_meta/glossary.md`
|
|
20
20
|
|
|
21
|
+
**Spec 真理冲突检测**(写入前必须完成):
|
|
22
|
+
- **必须读取现有 Spec**:在写 spec delta 前,必须读取 `<truth-root>/specs/**` 所有现有规格
|
|
23
|
+
- **目的**:检测新 spec delta 是否与现有 Specs 存在冲突
|
|
24
|
+
|
|
21
25
|
硬约束(必须遵守):
|
|
22
26
|
- 你输出的是 **spec delta**,不是设计文档、不是编码计划、不是代码实现
|
|
23
27
|
- 不写实现细节(类名/函数名/具体文件路径/库调用)
|
|
@@ -26,6 +30,13 @@
|
|
|
26
30
|
- 避免重复能力:先搜索/复用/修改已有 capability spec,必要时才新增 capability
|
|
27
31
|
- 统一语言:若 `<truth-root>/_meta/glossary.md` 存在,必须使用其中的术语;禁止发明新词汇
|
|
28
32
|
|
|
33
|
+
**概念完整性守护**(冲突检测规则):
|
|
34
|
+
- **术语冲突检测**:新 spec 中的术语是否与现有 spec 使用的术语命名不一致?(如 `Order.status` vs `Order.state`)
|
|
35
|
+
- **规则冲突检测**:新 spec 的规则是否与现有 spec 的规则矛盾?(如"已支付可取消" vs "已支付不可取消")
|
|
36
|
+
- **边界冲突检测**:新 spec 的职责边界是否与现有 spec 重叠?(如两个 spec 都声称拥有 payment 逻辑)
|
|
37
|
+
- **Invariant 兼容检测**:新 spec 是否破坏现有 spec 声明的 Invariants?
|
|
38
|
+
- **冲突报告**:如检测到冲突,必须在 spec delta 开头声明冲突并建议解决方案;冲突未解决前禁止归档
|
|
39
|
+
|
|
29
40
|
研讨会(内部步骤,不单独输出):
|
|
30
41
|
- 在写 spec 前先做“虚拟三剑客研讨会”(业务/开发/测试),把共识与边缘实例融入 Requirement/Scenario;不要单独输出研讨会纪要
|
|
31
42
|
|
|
@@ -14,44 +14,98 @@ allowed-tools:
|
|
|
14
14
|
|
|
15
15
|
## 工作流位置感知(Workflow Position Awareness)
|
|
16
16
|
|
|
17
|
-
> **核心原则**:Test Owner
|
|
17
|
+
> **核心原则**:Test Owner 在整体工作流中承担**双阶段职责**,通过**模式标签**(而非会话隔离)实现思维清晰。
|
|
18
18
|
|
|
19
19
|
### 我在整体工作流中的位置
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
proposal → design → [
|
|
23
|
-
↓
|
|
24
|
-
Red
|
|
22
|
+
proposal → design → [TEST-OWNER] → [CODER] → [TEST-OWNER] → code-review → archive
|
|
23
|
+
↓ ↓ ↓
|
|
24
|
+
Red 基线 实现+快轨 证据审计+打勾
|
|
25
|
+
(增量测试) (@smoke) (不重跑@full)
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
### AI 时代个人开发优化
|
|
29
|
+
|
|
30
|
+
> **重要变更**:本协议针对 AI 编程 + 个人开发场景优化,**去掉了"单独会话"的硬性要求**。
|
|
31
|
+
|
|
32
|
+
| 旧设计 | 新设计 | 原因 |
|
|
33
|
+
|--------|--------|------|
|
|
34
|
+
| Test Owner 和 Coder 必须单独会话 | 同一会话,用 `[TEST-OWNER]` / `[CODER]` 模式标签切换 | 减少上下文重建成本 |
|
|
35
|
+
| 阶段2 重跑完整测试 | 阶段2 默认**审计证据**,可选抽样重跑 | 避免慢测试多次运行 |
|
|
36
|
+
| 测试无分层要求 | 强制测试分层:`@smoke`/`@critical`/`@full` | 快速反馈循环 |
|
|
37
|
+
|
|
27
38
|
### Test Owner 的双阶段职责
|
|
28
39
|
|
|
29
|
-
| 阶段 | 触发时机 | 核心职责 | 产出 |
|
|
30
|
-
|
|
31
|
-
| **阶段 1:Red 基线** | design.md 完成后 | 编写测试、产出失败证据 | verification.md (Status=Ready)、Red 基线 |
|
|
32
|
-
| **阶段 2:Green 验证** | Coder
|
|
40
|
+
| 阶段 | 触发时机 | 核心职责 | 测试运行方式 | 产出 |
|
|
41
|
+
|------|----------|----------|--------------|------|
|
|
42
|
+
| **阶段 1:Red 基线** | design.md 完成后 | 编写测试、产出失败证据 | 只跑**增量测试**(新写的/P0) | verification.md (Status=Ready)、Red 基线 |
|
|
43
|
+
| **阶段 2:Green 验证** | Coder 完成 + @full 通过后 | **审计证据**、勾选 AC 覆盖矩阵 | 默认不重跑,可选抽样 | AC 矩阵打勾、Status=Verified |
|
|
33
44
|
|
|
34
45
|
### 阶段 2 详细职责(关键!)
|
|
35
46
|
|
|
36
47
|
当用户说"Coder 完成了,请验证"或类似请求时,Test Owner 进入**阶段 2**:
|
|
37
48
|
|
|
38
|
-
1.
|
|
39
|
-
2.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
1. **检查前置条件**:确认 @full 测试已通过(查看 CI 结果或 `evidence/green-final/`)
|
|
50
|
+
2. **审计证据**(默认模式):
|
|
51
|
+
- 检查 `evidence/green-final/` 目录下的测试日志
|
|
52
|
+
- 验证 commit hash 与当前代码一致
|
|
53
|
+
- 确认测试覆盖了所有 AC
|
|
54
|
+
3. **可选抽样重跑**:对高风险 AC 或有疑问的测试进行抽样验证
|
|
55
|
+
4. **勾选 AC 覆盖矩阵**:在 verification.md 的 AC 覆盖矩阵中将 `[ ]` 改为 `[x]`
|
|
56
|
+
5. **设置状态为 Verified**:表示测试验证通过,等待 Code Review
|
|
43
57
|
|
|
44
58
|
### AC 覆盖矩阵复选框权限(重要!)
|
|
45
59
|
|
|
46
60
|
| 复选框位置 | 谁可以勾选 | 勾选时机 |
|
|
47
61
|
|------------|-----------|----------|
|
|
48
|
-
| AC 覆盖矩阵中的 `[ ]` | **Test Owner** | 阶段 2
|
|
62
|
+
| AC 覆盖矩阵中的 `[ ]` | **Test Owner** | 阶段 2 审计证据确认后 |
|
|
63
|
+
| Status 字段 `Verified` | **Test Owner** | 阶段 2 完成后 |
|
|
49
64
|
| Status 字段 `Done` | Reviewer | Code Review 通过后 |
|
|
50
65
|
|
|
51
66
|
**禁止**:Coder 不能勾选 AC 覆盖矩阵,不能修改 verification.md。
|
|
52
67
|
|
|
53
68
|
---
|
|
54
69
|
|
|
70
|
+
## 测试分层与运行策略(关键!)
|
|
71
|
+
|
|
72
|
+
> **核心原则**:测试分层是解决"慢测试阻塞开发"问题的关键。
|
|
73
|
+
|
|
74
|
+
### 测试分层标签(必须使用)
|
|
75
|
+
|
|
76
|
+
| 标签 | 用途 | 谁运行 | 预期耗时 | 何时运行 |
|
|
77
|
+
|------|------|--------|----------|----------|
|
|
78
|
+
| `@smoke` | 快速反馈,核心路径 | Coder 频繁运行 | 秒级 | 每次代码修改后 |
|
|
79
|
+
| `@critical` | 关键功能验证 | Coder 提交前运行 | 分钟级 | 准备提交时 |
|
|
80
|
+
| `@full` | 完整验收测试 | CI 异步运行 | 可以慢(小时级) | 后台/CI |
|
|
81
|
+
|
|
82
|
+
### 各阶段测试运行策略
|
|
83
|
+
|
|
84
|
+
| 阶段 | 运行什么 | 目的 | 阻塞/异步 |
|
|
85
|
+
|------|----------|------|-----------|
|
|
86
|
+
| **Test Owner 阶段1** | 只跑**新写的测试** | 确认 Red 状态 | 同步(但只是增量) |
|
|
87
|
+
| **Coder 开发中** | `@smoke` | 快速反馈循环 | 同步 |
|
|
88
|
+
| **Coder 提交前** | `@critical` | 关键路径验证 | 同步 |
|
|
89
|
+
| **Coder 完成时** | `@full`(触发 CI) | 完整验收 | **异步**(不阻塞开发) |
|
|
90
|
+
| **Test Owner 阶段2** | **不运行**(审计证据) | 独立验证 | N/A |
|
|
91
|
+
|
|
92
|
+
### 异步与同步的边界(关键!)
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
✅ 异步的:开发迭代(Coder 完成后可以开始下一个变更,不等 @full)
|
|
96
|
+
❌ 同步的:归档门禁(归档必须等 @full 通过)
|
|
97
|
+
|
|
98
|
+
时间线示例:
|
|
99
|
+
T1: Coder 完成实现,触发 @full 异步测试 → 状态 = Implementation Done
|
|
100
|
+
T2: Coder 可以开始下一个变更(不阻塞)
|
|
101
|
+
T3: @full 测试通过 → 状态 = 可进入阶段2
|
|
102
|
+
T4: Test Owner 审计证据 + 打勾 → 状态 = Verified
|
|
103
|
+
T5: Code Review → 状态 = Done
|
|
104
|
+
T6: 归档(此时 @full 一定已通过)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
55
109
|
## 前置:配置发现(协议无关)
|
|
56
110
|
|
|
57
111
|
- `<truth-root>`:当前真理目录根
|
|
@@ -86,10 +140,15 @@ Test Owner 必须产出结构化的 `verification.md`,同时作为测试计划
|
|
|
86
140
|
|------|------|-----------|
|
|
87
141
|
| `Draft` | 初始状态 | 自动生成 |
|
|
88
142
|
| `Ready` | 测试计划就绪 | **Test Owner** |
|
|
143
|
+
| `Implementation Done` | 实现完成,等待 @full 测试 | **Coder** |
|
|
144
|
+
| `Verified` | @full 通过 + 证据审计完成 | **Test Owner** |
|
|
89
145
|
| `Done` | Review 通过 | Reviewer(禁止 Test Owner/Coder) |
|
|
90
|
-
| `Archived` | 已归档 |
|
|
146
|
+
| `Archived` | 已归档 | Archiver |
|
|
91
147
|
|
|
92
|
-
|
|
148
|
+
**关键约束**:
|
|
149
|
+
- `Verified` 状态要求 @full 测试必须已通过
|
|
150
|
+
- 只有 `Verified` 或 `Done` 状态的变更才能归档
|
|
151
|
+
- Test Owner 完成测试计划后设 `Ready`,完成证据审计后设 `Verified`
|
|
93
152
|
|
|
94
153
|
```markdown
|
|
95
154
|
# 验证计划:<change-id>
|
|
@@ -385,14 +444,14 @@ Test Owner 有两个阶段,完成状态因阶段而异:
|
|
|
385
444
|
|
|
386
445
|
| 当前阶段 | 如何判断 | 完成后下一步 |
|
|
387
446
|
|----------|----------|--------------|
|
|
388
|
-
| **阶段 1** | verification.md 不存在或 Red 基线未产出 | →
|
|
389
|
-
| **阶段 2** | 用户说"验证/打勾"且
|
|
447
|
+
| **阶段 1** | verification.md 不存在或 Red 基线未产出 | → `[CODER]` 模式 |
|
|
448
|
+
| **阶段 2** | 用户说"验证/打勾"且 @full 测试已通过 | → Code Review |
|
|
390
449
|
|
|
391
450
|
### 阶段 1 完成状态分类(MECE)
|
|
392
451
|
|
|
393
452
|
| 状态码 | 状态 | 判定条件 | 下一步 |
|
|
394
453
|
|:------:|------|----------|--------|
|
|
395
|
-
| ✅ | PHASE1_COMPLETED | Red 基线产出,无偏离 | `
|
|
454
|
+
| ✅ | PHASE1_COMPLETED | Red 基线产出,无偏离 | 切换到 `[CODER]` 模式 |
|
|
396
455
|
| ⚠️ | PHASE1_COMPLETED_WITH_DEVIATION | Red 基线产出,deviation-log 有未回写记录 | `devbooks-design-backport` |
|
|
397
456
|
| ❌ | BLOCKED | 需要外部输入/决策 | 记录断点,等待用户 |
|
|
398
457
|
| 💥 | FAILED | 测试框架问题等 | 修复后重试 |
|
|
@@ -401,8 +460,9 @@ Test Owner 有两个阶段,完成状态因阶段而异:
|
|
|
401
460
|
|
|
402
461
|
| 状态码 | 状态 | 判定条件 | 下一步 |
|
|
403
462
|
|:------:|------|----------|--------|
|
|
404
|
-
| ✅ | PHASE2_VERIFIED |
|
|
405
|
-
|
|
|
463
|
+
| ✅ | PHASE2_VERIFIED | 证据审计通过,AC 矩阵已打勾 | `devbooks-code-review` |
|
|
464
|
+
| ⏳ | PHASE2_WAITING | @full 测试仍在运行 | 等待 CI 完成 |
|
|
465
|
+
| ❌ | PHASE2_FAILED | @full 测试未通过 | 通知 Coder 修复 |
|
|
406
466
|
| 🔄 | PHASE2_HANDOFF | 发现测试本身有问题 | 修复测试后重新验证 |
|
|
407
467
|
|
|
408
468
|
### 阶段判定流程
|
|
@@ -421,11 +481,13 @@ Test Owner 有两个阶段,完成状态因阶段而异:
|
|
|
421
481
|
c. 以上都通过 → PHASE1_COMPLETED
|
|
422
482
|
|
|
423
483
|
3. 阶段 2 状态判定:
|
|
424
|
-
a.
|
|
484
|
+
a. 检查 @full 测试是否已完成
|
|
485
|
+
→ 否:PHASE2_WAITING
|
|
486
|
+
b. 检查 @full 测试是否通过
|
|
425
487
|
→ 否:PHASE2_FAILED
|
|
426
|
-
|
|
488
|
+
c. 检查测试本身是否有问题
|
|
427
489
|
→ 是:PHASE2_HANDOFF
|
|
428
|
-
|
|
490
|
+
d. 审计证据,确认覆盖 → PHASE2_VERIFIED
|
|
429
491
|
```
|
|
430
492
|
|
|
431
493
|
### 路由输出模板(必须使用)
|
|
@@ -437,11 +499,13 @@ Test Owner 有两个阶段,完成状态因阶段而异:
|
|
|
437
499
|
|
|
438
500
|
**阶段**:阶段 1(Red 基线)/ 阶段 2(Green 验证)
|
|
439
501
|
|
|
440
|
-
**状态**:✅ PHASE1_COMPLETED / ✅ PHASE2_VERIFIED /
|
|
502
|
+
**状态**:✅ PHASE1_COMPLETED / ✅ PHASE2_VERIFIED / ⏳ PHASE2_WAITING / ...
|
|
441
503
|
|
|
442
504
|
**Red 基线**:已产出 / 未完成(仅阶段 1)
|
|
443
505
|
|
|
444
|
-
|
|
506
|
+
**@full 测试**:已通过 / 运行中 / 失败(仅阶段 2)
|
|
507
|
+
|
|
508
|
+
**证据审计**:已完成 / 待审计(仅阶段 2)
|
|
445
509
|
|
|
446
510
|
**AC 矩阵**:已打勾 N/M / 未打勾(仅阶段 2)
|
|
447
511
|
|
|
@@ -449,31 +513,29 @@ Test Owner 有两个阶段,完成状态因阶段而异:
|
|
|
449
513
|
|
|
450
514
|
## 下一步
|
|
451
515
|
|
|
452
|
-
|
|
516
|
+
**推荐**:切换到 `[CODER]` 模式 / `devbooks-xxx skill`
|
|
453
517
|
|
|
454
518
|
**原因**:[具体原因]
|
|
455
|
-
|
|
456
|
-
### 如何调用
|
|
457
|
-
运行 devbooks-xxx skill 处理变更 <change-id>
|
|
458
519
|
```
|
|
459
520
|
|
|
460
521
|
### 具体路由规则
|
|
461
522
|
|
|
462
523
|
| 我的状态 | 下一步 | 原因 |
|
|
463
524
|
|----------|--------|------|
|
|
464
|
-
| PHASE1_COMPLETED | `
|
|
525
|
+
| PHASE1_COMPLETED | 切换到 `[CODER]` 模式 | Red 基线已产出,Coder 实现以变绿 |
|
|
465
526
|
| PHASE1_COMPLETED_WITH_DEVIATION | `devbooks-design-backport` | 先回写设计,再交给 Coder |
|
|
466
|
-
| PHASE2_VERIFIED | `devbooks-code-review` |
|
|
467
|
-
|
|
|
527
|
+
| PHASE2_VERIFIED | `devbooks-code-review` | 证据审计通过,可以进入代码评审 |
|
|
528
|
+
| PHASE2_WAITING | 等待 CI | @full 测试仍在运行 |
|
|
529
|
+
| PHASE2_FAILED | 通知 Coder 修复 | 测试未通过,需要 Coder 修复 |
|
|
468
530
|
| PHASE2_HANDOFF | 修复测试 | 测试本身有问题,Test Owner 修复 |
|
|
469
531
|
| BLOCKED | 等待用户 | 记录断点区 |
|
|
470
532
|
| FAILED | 修复后重试 | 分析失败原因 |
|
|
471
533
|
|
|
472
534
|
**关键约束**:
|
|
473
|
-
-
|
|
474
|
-
- Test Owner 和 Coder 不能共享同一会话上下文
|
|
535
|
+
- **模式切换替代会话隔离**:使用 `[TEST-OWNER]` / `[CODER]` 标签切换模式
|
|
475
536
|
- 如有偏离,必须先 design-backport 再交给 Coder
|
|
476
537
|
- **阶段 2 的 AC 矩阵打勾只能由 Test Owner 执行**
|
|
538
|
+
- **阶段 2 必须等 @full 测试通过后才能打勾**
|
|
477
539
|
|
|
478
540
|
---
|
|
479
541
|
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
- 设计/规格文档
|
|
12
12
|
- 测试驱动/验收方法论(参考:`references/测试驱动.md`)
|
|
13
13
|
|
|
14
|
+
**必须读取的 Spec 真理**(测试前强制检查):
|
|
15
|
+
- `<truth-root>/specs/**`:现有规格文件
|
|
16
|
+
- 目的:从 Spec 中的契约(Preconditions/Postconditions/Invariants)和状态机自动生成测试骨架
|
|
17
|
+
|
|
14
18
|
产物落点(目录约定,协议无关):
|
|
15
19
|
- 测试计划与追溯文档推荐保存为:`<change-root>/<change-id>/verification.md`
|
|
16
20
|
- 测试代码变更仍落在仓库惯例目录(例如 `tests/`),但追溯矩阵与人工验收清单优先放在本次变更包内(verification.md),避免散落到对外 docs
|
|
@@ -57,7 +61,7 @@
|
|
|
57
61
|
在完成 A 后,开始在仓库中实现测试代码(只写测试,不写业务实现),要求:
|
|
58
62
|
|
|
59
63
|
【核心理念(必须遵守)】
|
|
60
|
-
1) **测试=可执行契约(Executable Spec
|
|
64
|
+
1) **测试=可执行契约(Executable Spec)**:从"设计要求/验收标准/不变量"推导测试,而不是从"现有代码结构"推导测
|
|
61
65
|
试。
|
|
62
66
|
2) **行为优先、实现无关**:优先断言输出行为/数据契约/事件内容/不变量;避免断言私有函数调用次数、内部步骤顺序等实
|
|
63
67
|
现细节。
|
|
@@ -65,6 +69,16 @@
|
|
|
65
69
|
归。
|
|
66
70
|
4) **少而硬(风险驱动)**:优先覆盖最危险的失败模式(隔离、幂等/重放、质量闸门、错误级联阻断、契约漂移)。
|
|
67
71
|
|
|
72
|
+
**从 Spec 真理生成契约测试**(必须遵守):
|
|
73
|
+
- **Invariants → 不变量测试**:Spec 中每个 `[Invariant]` 或 `INV-xxx` 必须生成对应的不变量测试
|
|
74
|
+
- **Preconditions → 前置条件测试**:Spec 中每个 `PRE-xxx` 生成两类测试:(1) 满足条件时正常执行 (2) 违反条件时正确拒绝
|
|
75
|
+
- **Postconditions → 后置条件测试**:Spec 中每个 `POST-xxx` 生成结果验证测试
|
|
76
|
+
- **State Machine → 状态转换测试**:如 Spec 包含状态机定义,必须生成:
|
|
77
|
+
- 所有合法转换路径的测试
|
|
78
|
+
- 所有禁止转换的拒绝测试
|
|
79
|
+
- 终态不可转出的测试
|
|
80
|
+
- **REQ 覆盖追溯**:每个测试必须在注释或 verification.md 中标注其覆盖的 REQ-xxx/INV-xxx/PRE-xxx/POST-xxx
|
|
81
|
+
|
|
68
82
|
**测试覆盖率分级要求**(辩论修订版):
|
|
69
83
|
> 来源:《重构》辩论修订版——从"一刀切80%"改为"分级要求"
|
|
70
84
|
|