dev-playbooks-cn 1.3.0 → 1.5.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev-playbooks-cn",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "AI-driven spec-based development workflow",
5
5
  "keywords": [
6
6
  "devbooks",
@@ -14,16 +14,27 @@ allowed-tools:
14
14
 
15
15
  ## 工作流位置感知(Workflow Position Awareness)
16
16
 
17
- > **核心原则**:Coder 在 Test Owner 阶段 1 之后执行,完成后交给 Test Owner 阶段 2 验证。
17
+ > **核心原则**:Coder 在 Test Owner 阶段 1 之后执行,通过**模式标签**(而非会话隔离)实现思维清晰。
18
18
 
19
19
  ### 我在整体工作流中的位置
20
20
 
21
21
  ```
22
- proposal → design → test-owner(阶段1) → [Coder] → test-owner(阶段2) → code-review → archive
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
- | 运行测试验证 | ❌ 设置 verification.md Status |
45
+ | 运行快轨测试(`@smoke`/`@critical`) | ❌ 设置 verification.md Status 为 Verified/Done |
46
+ | 触发 `@full` 测试(CI/后台) | ❌ 等待 @full 完成(可以开始下一个变更) |
35
47
 
36
48
  ### Coder 完成后的流程
37
49
 
38
- 1. **任务完成**:tasks.md 全部 `[x]`
39
- 2. **测试全绿**:运行 `npm test` 确认通过
40
- 3. **交付 Test Owner**:通知 Test Owner 进入阶段 2 验证
41
- 4. **等待验证结果**:
42
- - Test Owner 确认全绿 → 进入 Code Review
43
- - Test Owner 发现问题 Coder 修复
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
- **关键提醒**:Coder 完成后,**不是直接进入 Code Review**,而是先让 Test Owner 验证并打勾。
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
- | ✅ | COMPLETED | 所有任务完成,无偏离 | `devbooks-code-review` |
323
- | ⚠️ | COMPLETED_WITH_DEVIATION | 任务完成,deviation-log 有未回写记录 | `devbooks-design-backport` |
324
- | 🔄 | HANDOFF | 发现测试问题需要修改 | `devbooks-test-owner` |
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
- → 有:COMPLETED_WITH_DEVIATION
385
+ → 有:IMPLEMENTATION_DONE_WITH_DEVIATION
333
386
 
334
387
  2. 检查是否需要修改 tests/
335
- → 是:HANDOFF to test-owner
388
+ → 是:HANDOFF to [TEST-OWNER] 模式
389
+
390
+ 3. 检查快轨测试(@smoke + @critical)是否全部通过
391
+ → 否:FAILED
336
392
 
337
- 3. 检查 tasks.md 是否全部完成
338
- → 否:BLOCKED 或 FAILED
393
+ 4. 检查 tasks.md 是否全部完成
394
+ → 否:BLOCKED 或继续实现
339
395
 
340
- 4. 以上都通过
341
- COMPLETED
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
- **状态**:✅ COMPLETED / ⚠️ COMPLETED_WITH_DEVIATION / 🔄 HANDOFF / ❌ BLOCKED / 💥 FAILED
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
- **推荐**:`devbooks-xxx skill`
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
- | COMPLETED | `devbooks-test-owner`(阶段 2 验证) | 任务完成,需要 Test Owner 验证并打勾 |
372
- | COMPLETED_WITH_DEVIATION | `devbooks-design-backport` | 先回写设计,再让 Test Owner 验证 |
373
- | HANDOFF (测试问题) | `devbooks-test-owner` | Coder 不能修改测试 |
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
- - 如发现测试问题,必须 HANDOFF 给 Test Owner(单独会话)
438
+ - 如发现测试问题,必须切换到 `[TEST-OWNER]` 模式处理
380
439
  - 如有偏离,必须先 design-backport 再继续
381
- - **Coder 完成后必须先经过 Test Owner 阶段 2 验证,再进入 Code Review**
440
+ - **Coder 完成后状态是 `Implementation Done`,必须等 @full 通过后才能进入 Test Owner 阶段 2**
441
+ - **模式切换替代会话隔离**:使用 `[TEST-OWNER]` / `[CODER]` 标签切换模式
382
442
 
383
443
  ---
384
444
 
@@ -0,0 +1,394 @@
1
+ ---
2
+ name: devbooks-convergence-audit
3
+ description: devbooks-convergence-audit:以证据优先、声明存疑的原则评估 DevBooks 工作流收敛性,检测"西西弗斯反模式"和"假完成"。主动验证而非信任文档声明。用户说"评估收敛性/检查升级健康度/西西弗斯检测/工作流审计"等时使用。
4
+ allowed-tools:
5
+ - Glob
6
+ - Grep
7
+ - Read
8
+ - Bash
9
+ ---
10
+
11
+ # DevBooks:收敛性审计(Convergence Audit)
12
+
13
+ ## 核心原则:反迷惑设计
14
+
15
+ > **黄金法则**:**证据 > 声明**。永远不要相信文档中的任何断言,必须通过可验证的证据确认。
16
+
17
+ ### AI 容易被迷惑的场景(必须防范)
18
+
19
+ | 迷惑场景 | AI 错误行为 | 正确行为 |
20
+ |----------|-------------|----------|
21
+ | 文档写 `Status: Done` | 相信已完成 | 验证:测试是否真的全绿?证据是否存在? |
22
+ | AC 矩阵全部 `[x]` | 相信全覆盖 | 验证:每个 AC 对应的测试文件是否存在且通过? |
23
+ | 文档写"测试通过" | 相信通过 | 验证:实际运行测试或检查 CI 日志时间戳 |
24
+ | `evidence/` 目录存在 | 相信有证据 | 验证:目录非空?内容是否为有效测试日志? |
25
+ | tasks.md 全部 `[x]` | 相信已实现 | 验证:对应代码文件是否存在且有实质内容? |
26
+ | 提交信息说"修复了" | 相信已修复 | 验证:相关测试是否从红变绿? |
27
+
28
+ ### 反迷惑三原则
29
+
30
+ ```
31
+ 1. 声明存疑(Distrust Declarations)
32
+ - 任何文档中的"完成/通过/覆盖"声明都是待验证的假设
33
+ - 默认立场:声明可能是错误的、过时的、或乐观的
34
+
35
+ 2. 证据优先(Evidence First)
36
+ - 代码/测试结果是唯一真理
37
+ - 日志时间戳必须晚于最后一次代码修改
38
+ - 空目录/空文件 = 无证据
39
+
40
+ 3. 交叉验证(Cross Validation)
41
+ - 声明 vs 证据:检查是否一致
42
+ - 代码 vs 测试:检查是否匹配
43
+ - 多个文档:检查是否矛盾
44
+ ```
45
+
46
+ ---
47
+
48
+ ## 验证检查清单(逐项执行)
49
+
50
+ ### 检查 1:Status 字段真实性验证
51
+
52
+ **文档声明**:`verification.md` 中 `Status: Done` 或 `Status: Verified`
53
+
54
+ **验证步骤**:
55
+ ```bash
56
+ # 1. 检查 verification.md 是否存在
57
+ [[ -f "verification.md" ]] || echo "❌ verification.md 不存在"
58
+
59
+ # 2. 检查 evidence/green-final/ 是否有内容
60
+ if [[ -z "$(ls -A evidence/green-final/ 2>/dev/null)" ]]; then
61
+ echo "❌ Status 声称完成,但 evidence/green-final/ 为空"
62
+ fi
63
+
64
+ # 3. 检查证据时间戳是否晚于代码最后修改
65
+ code_mtime=$(stat -f %m src/ 2>/dev/null || stat -c %Y src/)
66
+ evidence_mtime=$(stat -f %m evidence/green-final/* 2>/dev/null | sort -n | tail -1)
67
+ if [[ $evidence_mtime -lt $code_mtime ]]; then
68
+ echo "❌ 证据时间早于代码修改,证据可能过时"
69
+ fi
70
+ ```
71
+
72
+ **迷惑检测**:
73
+ - ⚠️ Status=Done 但 evidence/ 为空 → **假完成**
74
+ - ⚠️ Status=Done 但证据时间戳过旧 → **过时证据**
75
+ - ⚠️ Status=Done 但测试实际运行失败 → **虚假状态**
76
+
77
+ ---
78
+
79
+ ### 检查 2:AC 覆盖矩阵真实性验证
80
+
81
+ **文档声明**:AC 矩阵中 `[x]` 表示已覆盖
82
+
83
+ **验证步骤**:
84
+ ```bash
85
+ # 1. 提取所有声称已覆盖的 AC
86
+ grep -E '^\| AC-[0-9]+.*\[x\]' verification.md | while read line; do
87
+ ac_id=$(echo "$line" | grep -oE 'AC-[0-9]+')
88
+ test_id=$(echo "$line" | grep -oE 'T-[0-9]+')
89
+
90
+ # 2. 验证对应测试是否存在
91
+ if ! grep -rq "$test_id\|$ac_id" tests/; then
92
+ echo "❌ $ac_id 声称已覆盖,但找不到对应测试"
93
+ fi
94
+ done
95
+
96
+ # 3. 实际运行测试验证(最可靠)
97
+ npm test 2>&1 | tee /tmp/test-output.log
98
+ if grep -q "FAIL\|Error\|failed" /tmp/test-output.log; then
99
+ echo "❌ AC 声称全覆盖,但测试实际有失败"
100
+ fi
101
+ ```
102
+
103
+ **迷惑检测**:
104
+ - ⚠️ AC 打勾但对应测试文件不存在 → **虚假覆盖**
105
+ - ⚠️ AC 打勾但测试实际失败 → **假绿**
106
+ - ⚠️ AC 打勾但测试内容为空/占位符 → **占位符测试**
107
+
108
+ ---
109
+
110
+ ### 检查 3:tasks.md 完成度真实性验证
111
+
112
+ **文档声明**:tasks.md 中 `[x]` 表示已完成
113
+
114
+ **验证步骤**:
115
+ ```bash
116
+ # 1. 提取所有声称已完成的任务
117
+ grep -E '^\- \[x\]' tasks.md | while read line; do
118
+ # 2. 提取任务描述中的关键词(函数名/文件名/功能)
119
+ keywords=$(echo "$line" | grep -oE '[A-Za-z]+[A-Za-z0-9]*' | head -5)
120
+
121
+ # 3. 验证代码中是否有对应实现
122
+ for kw in $keywords; do
123
+ if ! grep -rq "$kw" src/; then
124
+ echo "⚠️ 任务声称完成,但代码中找不到关键词: $kw"
125
+ fi
126
+ done
127
+ done
128
+
129
+ # 4. 检查是否有"骨架代码"(只有函数签名没有实现)
130
+ grep -rE 'throw new Error\(.*not implemented|TODO|FIXME|pass$|\.\.\.}' src/ && \
131
+ echo "⚠️ 发现未实现的占位符代码"
132
+ ```
133
+
134
+ **迷惑检测**:
135
+ - ⚠️ 任务打勾但代码不存在 → **虚假完成**
136
+ - ⚠️ 任务打勾但代码是占位符 → **骨架代码**
137
+ - ⚠️ 任务打勾但功能不可调用 → **死代码**
138
+
139
+ ---
140
+
141
+ ### 检查 4:证据有效性验证
142
+
143
+ **文档声明**:`evidence/` 目录包含测试证据
144
+
145
+ **验证步骤**:
146
+ ```bash
147
+ # 1. 检查目录是否存在且非空
148
+ if [[ ! -d "evidence" ]] || [[ -z "$(ls -A evidence/)" ]]; then
149
+ echo "❌ evidence/ 不存在或为空"
150
+ exit 1
151
+ fi
152
+
153
+ # 2. 检查证据文件是否有实质内容
154
+ for f in evidence/**/*; do
155
+ if [[ -f "$f" ]]; then
156
+ lines=$(wc -l < "$f")
157
+ if [[ $lines -lt 5 ]]; then
158
+ echo "⚠️ 证据文件内容过少: $f ($lines 行)"
159
+ fi
160
+
161
+ # 3. 检查是否为有效测试日志(包含测试框架输出特征)
162
+ if ! grep -qE 'PASS|FAIL|✓|✗|passed|failed|test|spec' "$f"; then
163
+ echo "⚠️ 证据文件不像测试日志: $f"
164
+ fi
165
+ fi
166
+ done
167
+
168
+ # 4. 检查 red-baseline 证据是否真的是红色(有失败)
169
+ if [[ -d "evidence/red-baseline" ]]; then
170
+ if ! grep -rqE 'FAIL|Error|✗|failed' evidence/red-baseline/; then
171
+ echo "❌ red-baseline 声称是红色,但没有失败记录"
172
+ fi
173
+ fi
174
+
175
+ # 5. 检查 green-final 证据是否真的是绿色(全通过)
176
+ if [[ -d "evidence/green-final" ]]; then
177
+ if grep -rqE 'FAIL|Error|✗|failed' evidence/green-final/; then
178
+ echo "❌ green-final 声称是绿色,但包含失败记录"
179
+ fi
180
+ fi
181
+ ```
182
+
183
+ **迷惑检测**:
184
+ - ⚠️ evidence/ 存在但内容为空 → **空证据**
185
+ - ⚠️ 证据文件太小(< 5 行)→ **占位符证据**
186
+ - ⚠️ red-baseline 没有失败记录 → **伪造红色**
187
+ - ⚠️ green-final 包含失败记录 → **伪造绿色**
188
+
189
+ ---
190
+
191
+ ### 检查 5:Git 历史交叉验证
192
+
193
+ **原理**:Git 历史不会撒谎,用它来验证文档声明
194
+
195
+ **验证步骤**:
196
+ ```bash
197
+ # 1. 检查声称完成的变更是否有对应的代码提交
198
+ change_id="xxx"
199
+ commits=$(git log --oneline --all --grep="$change_id" | wc -l)
200
+ if [[ $commits -eq 0 ]]; then
201
+ echo "❌ 变更 $change_id 声称完成,但 git 历史中没有相关提交"
202
+ fi
203
+
204
+ # 2. 检查测试文件是否在代码之后添加(TDD 违规检测)
205
+ for test_file in tests/**/*.test.*; do
206
+ test_added=$(git log --format=%at --follow -- "$test_file" | tail -1)
207
+ # 找到对应的源文件
208
+ src_file=$(echo "$test_file" | sed 's/tests/src/' | sed 's/.test//')
209
+ if [[ -f "$src_file" ]]; then
210
+ src_added=$(git log --format=%at --follow -- "$src_file" | tail -1)
211
+ if [[ $test_added -gt $src_added ]]; then
212
+ echo "⚠️ 测试后于代码添加(非 TDD): $test_file"
213
+ fi
214
+ fi
215
+ done
216
+
217
+ # 3. 检查是否有"一次性大提交"(可能是绕过流程)
218
+ git log --oneline -20 | while read line; do
219
+ commit=$(echo "$line" | cut -d' ' -f1)
220
+ files_changed=$(git show --stat "$commit" | grep -E '[0-9]+ file' | grep -oE '[0-9]+' | head -1)
221
+ if [[ $files_changed -gt 20 ]]; then
222
+ echo "⚠️ 大提交检测: $commit 修改了 $files_changed 个文件,可能绕过增量验证"
223
+ fi
224
+ done
225
+ ```
226
+
227
+ **迷惑检测**:
228
+ - ⚠️ 声称完成但无 git 提交 → **虚假变更**
229
+ - ⚠️ 测试后于代码添加 → **事后补测试**
230
+ - ⚠️ 大量文件一次提交 → **绕过增量验证**
231
+
232
+ ---
233
+
234
+ ### 检查 6:实时测试运行验证(最可靠)
235
+
236
+ **原理**:不信任任何日志,实际运行测试
237
+
238
+ **验证步骤**:
239
+ ```bash
240
+ # 1. 运行完整测试
241
+ echo "=== 实时测试验证 ==="
242
+ npm test 2>&1 | tee /tmp/live-test.log
243
+
244
+ # 2. 检查结果
245
+ if grep -qE 'FAIL|Error|failed' /tmp/live-test.log; then
246
+ echo "❌ 实时测试失败,文档声明不可信"
247
+ grep -E 'FAIL|Error|failed' /tmp/live-test.log
248
+ else
249
+ echo "✅ 实时测试通过"
250
+ fi
251
+
252
+ # 3. 对比实时结果与证据文件
253
+ if [[ -f "evidence/green-final/latest.log" ]]; then
254
+ live_pass=$(grep -c 'PASS\|✓\|passed' /tmp/live-test.log)
255
+ evidence_pass=$(grep -c 'PASS\|✓\|passed' evidence/green-final/latest.log)
256
+ if [[ $live_pass -ne $evidence_pass ]]; then
257
+ echo "⚠️ 实时通过数 ($live_pass) ≠ 证据通过数 ($evidence_pass)"
258
+ fi
259
+ fi
260
+ ```
261
+
262
+ **迷惑检测**:
263
+ - ⚠️ 证据说绿色但实时运行失败 → **过时证据/假绿**
264
+ - ⚠️ 实时通过数与证据不符 → **证据伪造/环境差异**
265
+
266
+ ---
267
+
268
+ ## 综合评分算法
269
+
270
+ ### 可信度评分(0-100)
271
+
272
+ ```python
273
+ def calculate_trustworthiness(checks):
274
+ score = 100
275
+
276
+ # 严重问题(每个 -20 分)
277
+ critical = [
278
+ "证据为空",
279
+ "实时测试失败",
280
+ "Status 声称完成但测试失败",
281
+ "green-final 包含失败记录"
282
+ ]
283
+
284
+ # 警告问题(每个 -10 分)
285
+ warnings = [
286
+ "证据时间戳过旧",
287
+ "AC 对应测试不存在",
288
+ "占位符代码",
289
+ "大提交检测"
290
+ ]
291
+
292
+ # 轻微问题(每个 -5 分)
293
+ minor = [
294
+ "测试后于代码添加",
295
+ "证据文件过小"
296
+ ]
297
+
298
+ for issue in checks.critical_issues:
299
+ score -= 20
300
+ for issue in checks.warnings:
301
+ score -= 10
302
+ for issue in checks.minor_issues:
303
+ score -= 5
304
+
305
+ return max(0, score)
306
+ ```
307
+
308
+ ### 收敛性判定
309
+
310
+ | 可信度 | 判定 | 建议 |
311
+ |--------|------|------|
312
+ | 90-100 | ✅ 可信收敛 | 继续当前流程 |
313
+ | 70-89 | ⚠️ 部分可信 | 需要补充验证 |
314
+ | 50-69 | 🟠 存疑 | 需要返工部分环节 |
315
+ | < 50 | 🔴 不可信 | 西西弗斯困境,需要全面审查 |
316
+
317
+ ---
318
+
319
+ ## 输出格式
320
+
321
+ ```markdown
322
+ # DevBooks 收敛性审计报告(反迷惑版)
323
+
324
+ ## 审计原则
325
+ 本报告采用"证据优先、声明存疑"原则,所有结论基于可验证证据,而非文档声明。
326
+
327
+ ## 声明 vs 证据对比
328
+
329
+ | 检查项 | 文档声明 | 实际验证 | 结论 |
330
+ |--------|----------|----------|------|
331
+ | Status | Done | 测试实际失败 | ❌ 假完成 |
332
+ | AC 覆盖 | 5/5 已打勾 | 2 个 AC 无对应测试 | ❌ 虚假覆盖 |
333
+ | 测试状态 | 全绿 | 实时运行 3 个失败 | ❌ 过时证据 |
334
+ | tasks.md | 10/10 完成 | 3 个任务代码不存在 | ❌ 虚假完成 |
335
+ | evidence/ | 存在 | 目录非空,内容有效 | ✅ 有效 |
336
+
337
+ ## 可信度评分
338
+
339
+ **总分**:45/100 🔴 不可信
340
+
341
+ **扣分明细**:
342
+ - -20:Status=Done 但实时测试失败
343
+ - -20:AC 声称全覆盖但 2 个无测试
344
+ - -10:tasks.md 3 个任务无代码
345
+ - -5:证据时间戳早于代码修改
346
+
347
+ ## 迷惑检测结果
348
+
349
+ ### 🔴 检测到的假完成
350
+ 1. `change-auth`:Status=Done,但 `npm test` 失败 3 个
351
+ 2. `fix-cache`:AC-003 打勾,但 `tests/cache.test.ts` 不存在
352
+
353
+ ### 🟡 可疑项
354
+ 1. `refactor-api`:evidence/green-final/ 时间戳早于最后代码提交 2 天
355
+ 2. `feature-login`:tasks.md 全部打勾,但 `src/login.ts` 包含 TODO
356
+
357
+ ## 真实状态判定
358
+
359
+ | 变更包 | 声明状态 | 真实状态 | 差距 |
360
+ |--------|----------|----------|------|
361
+ | change-auth | Done | 测试失败 | 🔴 严重 |
362
+ | fix-cache | Verified | 覆盖不全 | 🟠 中等 |
363
+ | refactor-api | Ready | 证据过时 | 🟡 轻微 |
364
+
365
+ ## 建议行动
366
+
367
+ ### 立即行动
368
+ 1. 将 `change-auth` 状态回退到 `In Progress`
369
+ 2. 为 `fix-cache` 的 AC-003 补充测试
370
+
371
+ ### 短期改进
372
+ 1. 建立证据时效性检查(证据必须晚于代码)
373
+ 2. AC 打勾前强制运行对应测试
374
+
375
+ ### 流程改进
376
+ 1. 禁止手动修改 Status,只能通过脚本验证后自动更新
377
+ 2. CI 集成收敛性检查,阻止假完成合入
378
+ ```
379
+
380
+ ---
381
+
382
+ ## 完成状态
383
+
384
+ **状态**:✅ AUDIT_COMPLETED
385
+
386
+ **核心发现**:
387
+ - 文档声明可信度:X%
388
+ - 检测到的假完成:N 个
389
+ - 需要返工的变更:M 个
390
+
391
+ **下一步**:
392
+ - 假完成 → 立即回退状态,重新验证
393
+ - 存疑项 → 补充证据或重新运行测试
394
+ - 可信项 → 继续当前流程
@@ -14,44 +14,98 @@ allowed-tools:
14
14
 
15
15
  ## 工作流位置感知(Workflow Position Awareness)
16
16
 
17
- > **核心原则**:Test Owner 在整体工作流中承担**双阶段职责**,确保与 Coder 的角色隔离。
17
+ > **核心原则**:Test Owner 在整体工作流中承担**双阶段职责**,通过**模式标签**(而非会话隔离)实现思维清晰。
18
18
 
19
19
  ### 我在整体工作流中的位置
20
20
 
21
21
  ```
22
- proposal → design → [Test Owner 阶段1] → coder → [Test Owner 阶段2] → code-review → archive
23
-
24
- Red 基线产出 Green 验证 + 打勾
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 完成后 | 验证测试通过、勾选 AC 覆盖矩阵 | AC 矩阵打勾、Status 保持 Ready(等 Reviewer 设 Done) |
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. **运行全部测试**:执行 `npm test` 或项目测试命令
39
- 2. **验证 Green 状态**:确认所有测试通过
40
- 3. **勾选 AC 覆盖矩阵**:在 verification.md 的 AC 覆盖矩阵中将 `[ ]` 改为 `[x]`
41
- 4. **收集 Green 证据**:保存到 `evidence/green-final/`
42
- 5. **输出验证报告**:总结测试结果和覆盖情况
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 验证 Green 状态后 |
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` | 已归档 | Spec Gardener |
146
+ | `Archived` | 已归档 | Archiver |
91
147
 
92
- **约束**:Test Owner 完成测试计划后,应将 Status 设为 `Ready`。
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 基线未产出 | → Coder |
389
- | **阶段 2** | 用户说"验证/打勾"且 Coder 已完成 | → Code Review |
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 基线产出,无偏离 | `devbooks-coder`(单独会话) |
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 | 测试全绿,AC 矩阵已打勾 | `devbooks-code-review` |
405
- | | PHASE2_FAILED | 测试未通过 | 通知 Coder 修复,或 HANDOFF |
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
- b. 检查测试本身是否有问题
488
+ c. 检查测试本身是否有问题
427
489
  → 是:PHASE2_HANDOFF
428
- c. 全绿且无问题 → PHASE2_VERIFIED
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
- **Green 验证**:全绿 / 有失败(仅阶段 2)
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
- **推荐**:`devbooks-xxx skill`
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 | `devbooks-coder`(单独会话) | Red 基线已产出,Coder 实现以变绿 |
525
+ | PHASE1_COMPLETED | 切换到 `[CODER]` 模式 | Red 基线已产出,Coder 实现以变绿 |
465
526
  | PHASE1_COMPLETED_WITH_DEVIATION | `devbooks-design-backport` | 先回写设计,再交给 Coder |
466
- | PHASE2_VERIFIED | `devbooks-code-review` | 测试全绿,可以进入代码评审 |
467
- | PHASE2_FAILED | 通知 Coder | 测试未通过,需要 Coder 修复 |
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
- - **角色隔离**:Coder 必须在**单独的会话/实例**中工作
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