@tea-agent/loop-agent 0.7.4 → 0.8.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.
Files changed (127) hide show
  1. package/AGENTS.md +143 -142
  2. package/CHANGELOG.md +148 -161
  3. package/README.md +206 -204
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/init.js +518 -488
  7. package/dist/commands/loop-benchmark.js +11 -11
  8. package/dist/commands/pi-reuse-benchmark.js +16 -16
  9. package/dist/executors/cursor-executor.js +1 -1
  10. package/dist/governance/manifest-types.js +1 -1
  11. package/dist/task/runtime.js +27 -27
  12. package/dist/worker/cli.js +3 -3
  13. package/dist/worker/observability/event-store.js +2 -1
  14. package/dist/worker/observability/read-model.js +51 -13
  15. package/dist/worker/observe/paths.js +2 -2
  16. package/dist/worker/observe/routes.js +4 -3
  17. package/dist/worker/observe/static/app.js +1479 -1419
  18. package/dist/worker/observe/static/dag-layout.d.ts +31 -0
  19. package/dist/worker/observe/static/dag-layout.js +83 -0
  20. package/dist/worker/observe/static/index.html +63 -63
  21. package/dist/worker/observe/static/styles.css +722 -613
  22. package/dist/worker/pool/run-store.js +7 -8
  23. package/dist/worker/run-task/run-task.js +11 -2
  24. package/dist/worker/runner/run-ready.js +1 -1
  25. package/dist/workflows/dag/canvas-observer.js +275 -275
  26. package/docs/README.md +80 -76
  27. package/docs/agent-dag-recovery-playbook.md +184 -184
  28. package/docs/agent-dag-runner.md +42 -42
  29. package/docs/architecture/runtime-boundaries.md +162 -162
  30. package/docs/cursor-executor-usage.md +25 -25
  31. package/docs/decisions/README.md +3 -3
  32. package/docs/design/README.md +49 -49
  33. package/docs/development-principles.md +73 -73
  34. package/docs/dynamic-workflow-dag-engine-roadmap.md +1749 -1749
  35. package/docs/exec-plans/README.md +6 -6
  36. package/docs/exec-plans/active/README.md +11 -12
  37. package/docs/exec-plans/completed/README.md +35 -32
  38. package/docs/feature-workflow.md +187 -187
  39. package/docs/harness-methodology-debugging.md +153 -153
  40. package/docs/harness-methodology-tdd.md +130 -130
  41. package/docs/harness-methodology-verification.md +27 -27
  42. package/docs/init-surface.manifest.json +245 -241
  43. package/docs/loop-agent-harness.md +63 -55
  44. package/docs/production-readiness.md +96 -96
  45. package/docs/progress/README.md +3 -3
  46. package/docs/reports/README.md +9 -9
  47. package/docs/skills/README.md +6 -6
  48. package/docs/skills/vetted-skill-registry.md +26 -26
  49. package/docs/templates/adr.md +60 -60
  50. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  51. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  52. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  53. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  54. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  55. package/docs/templates/agent-dag-report.schema.json +454 -454
  56. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  57. package/docs/templates/agent-dag.base.json +195 -195
  58. package/docs/templates/agent-dag.final-verification.json +190 -190
  59. package/docs/templates/agent-dag.schema.json +316 -316
  60. package/docs/templates/agent-dag.supervised-implementation.json +500 -500
  61. package/docs/templates/exec-plan.md +64 -64
  62. package/docs/templates/feature-spec.md +53 -53
  63. package/docs/templates/harness.schema.json +218 -0
  64. package/docs/templates/hybrid-dag.json +193 -193
  65. package/docs/templates/init-evolution-review.md +33 -33
  66. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  67. package/docs/templates/product-line/AGENTS.md +8 -8
  68. package/docs/templates/product-line/README.md +9 -9
  69. package/docs/templates/product-line/acceptance.yaml +14 -14
  70. package/docs/templates/product-line/closeout.yaml +9 -9
  71. package/docs/templates/product-line/design.md +13 -13
  72. package/docs/templates/product-line/links.md +10 -10
  73. package/docs/templates/product-line/requirement.md +17 -17
  74. package/docs/templates/product-line/task-graph.yaml +15 -15
  75. package/docs/templates/product-line/task.yaml +65 -65
  76. package/docs/templates/product-line/test-plan.md +7 -7
  77. package/docs/templates/production-readiness-checklist.md +57 -57
  78. package/docs/templates/progress-log.md +17 -17
  79. package/docs/templates/project-start-checklist.md +9 -9
  80. package/docs/templates/qa-report.md +48 -48
  81. package/docs/templates/sprint-contract.md +29 -29
  82. package/docs/templates/worker-dogfood-evidence.md +52 -52
  83. package/docs/templates/worker-dogfood-setup.md +48 -48
  84. package/docs/verification-matrix.md +49 -49
  85. package/examples/decision-gate-agent-dag.json +123 -123
  86. package/examples/example-dag.json +51 -51
  87. package/examples/hybrid-loop-agent-dag.json +194 -194
  88. package/harness.json +73 -71
  89. package/package.json +68 -67
  90. package/scripts/check-product-line-docs.sh +22 -22
  91. package/scripts/check-task-pool-root.sh +32 -0
  92. package/skills/ai-engineering-context/SKILL.md +48 -48
  93. package/skills/code-review-core/SKILL.md +20 -20
  94. package/skills/codebase-scout/SKILL.md +19 -19
  95. package/skills/init-capability-evolution/SKILL.md +69 -69
  96. package/skills/loop-agent/SKILL.md +149 -149
  97. package/skills/loop-agent/references/README.md +67 -67
  98. package/skills/loop-agent/references/command-reference.md +432 -412
  99. package/skills/loop-agent/references/harness-policy.md +263 -263
  100. package/skills/loop-agent/references/hybrid-dag.md +216 -216
  101. package/skills/loop-agent/references/learned/README.md +21 -21
  102. package/skills/loop-agent/references/long-running-loop.md +59 -59
  103. package/skills/loop-agent/references/model-routing.md +36 -36
  104. package/skills/loop-agent/references/multi-worktree.md +54 -54
  105. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  106. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  107. package/skills/loop-agent/references/pi-prompt.md +23 -23
  108. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +81 -81
  109. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  110. package/skills/loop-agent/references/task-workflow.md +89 -89
  111. package/skills/loop-agent/references/verification-and-failure-handling.md +128 -128
  112. package/skills/requesting-code-review/SKILL.md +101 -101
  113. package/skills/requesting-code-review/code-reviewer.md +168 -168
  114. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  115. package/skills/systematic-debugging/SKILL.md +296 -296
  116. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  117. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  118. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  119. package/skills/systematic-debugging/find-polluter.sh +63 -63
  120. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  121. package/skills/systematic-debugging/test-academic.md +14 -14
  122. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  123. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  124. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  125. package/skills/test-driven-development/SKILL.md +20 -20
  126. package/skills/verification-before-completion/SKILL.md +154 -154
  127. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,153 +1,153 @@
1
- # Harness Methodology: Systematic Debugging
2
-
3
- 从 Superpowers `systematic-debugging` skill 中提取的调试方法,适配本仓库 harness 工作流。
4
-
5
- ## Iron Law
6
-
7
- ```
8
- NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
9
- ```
10
-
11
- 没有完成 Phase 1(根因调查),就不能提出任何修复方案。修症状 = 失败。
12
-
13
- ## 何时使用
14
-
15
- 适用于任何技术问题:
16
- - 测试失败
17
- - 生产 bug
18
- - 意外行为
19
- - 性能问题
20
- - 构建/集成失败
21
-
22
- **尤其要在以下情况使用:**
23
- - 时间压力下(紧急情况最容易让人猜)
24
- - "一个快速修复"看起来很明显
25
- - 已经试过多次修复
26
- - 上一个修复没奏效
27
- - 不完全理解问题
28
-
29
- ## 四阶段流程
30
-
31
- 每个阶段必须完成才能进入下一个。
32
-
33
- ### Phase 1:根因调查
34
-
35
- **在尝试任何修复之前:**
36
-
37
- 1. **仔细读错误信息**
38
- - 不要跳过 error 和 warning
39
- - 错误信息常常包含精确的解决方案
40
- - 完整读 stack trace
41
- - 记下文件名、行号、错误码
42
-
43
- 2. **稳定复现**
44
- - 能可靠触发吗?
45
- - 精确步骤是什么?
46
- - 每次都发生?
47
- - 如果不能复现 → 收集更多数据,不要猜
48
-
49
- 3. **检查最近变更**
50
- - 什么改动可能导致这个问题?
51
- - `git diff`、最近提交
52
- - 新依赖、配置变更
53
- - 环境差异
54
-
55
- 4. **多组件系统:收集跨层证据**
56
-
57
- 当系统涉及多个组件(CI → build → sign, API → service → DB):
58
- ```
59
- 对每个组件边界:
60
- - 记录进入组件的数据
61
- - 记录离开组件的数据
62
- - 验证环境/配置传播
63
- - 检查每层状态
64
-
65
- 跑一次收集证据 → 分析证据确定失败组件 → 针对该组件调查
66
- ```
67
-
68
- 5. **追踪数据流**
69
-
70
- 当错误在深层调用栈中:
71
- - 坏值从哪里来?
72
- - 谁用坏值调用了这里?
73
- - 持续向上追踪直到源头
74
- - 在源头修复,不在症状处修复
75
-
76
- ### Phase 2:模式分析
77
-
78
- 1. **找工作中的例子** — 在同一个代码库里定位相似的工作代码
79
- 2. **对照参考实现** — 完整阅读参考实现,不要跳读
80
- 3. **识别差异** — 列出工作和失败之间的每一项差异,再小也不假设"这不重要"
81
- 4. **理解依赖** — 需要哪些其他组件、设置、配置、假设?
82
-
83
- ### Phase 3:假设与测试
84
-
85
- 1. **形成单一假设** — "我认为 X 是根因,因为 Y"
86
- 2. **最小测试** — 做最小的改动来测试假设,一次只变一个变量
87
- 3. **验证后再继续** — 成功了?→ Phase 4。没成功?→ 形成新假设。不要在原假设上叠加更多修复
88
-
89
- ### Phase 4:实现
90
-
91
- 1. **创建失败测试用例** — 遵循 RED-GREEN-REFACTOR(见 `docs/harness-methodology-tdd.md`)
92
- 2. **实现单一修复** — 解决已识别的根因,一次一个改动,不顺手重构
93
- 3. **验证修复** — 测试通过?其他测试没坏?问题真的解决了?
94
- 4. **如果修复无效**:
95
- - 尝试了几个修复?
96
- - < 3 个 → 回到 Phase 1 重新分析
97
- - **≥ 3 个 → 停止,质疑架构(Phase 4.5)**
98
-
99
- ### Phase 4.5:质疑架构
100
-
101
- **以下模式表明架构问题:**
102
- - 每次修复暴露新的共享状态/耦合/不同位置的问题
103
- - 修复需要"大规模重构"才能实现
104
- - 每次修复在其他地方产生新症状
105
-
106
- **停止并质疑基础:**
107
- - 这个模式从根本上正确吗?
108
- - 我们是否在"靠惯性坚持它"?
109
- - 是否应该重构架构,而不是继续修症状?
110
-
111
- 在尝试更多修复之前讨论。
112
-
113
- ## Red Flags:停止并回到 Phase 1
114
-
115
- 如果你发现自己这样想:
116
- - "先快速修一下,后面再调查"
117
- - "试试改 X 看看行不行"
118
- - "一次改多个东西然后跑测试"
119
- - "跳过测试,手工验证就行"
120
- - "大概就是 X 的问题,直接修吧"
121
- - "不太确定但可能有用"
122
- - "再试一个修复"(已经试了 2+ 次)
123
-
124
- **以上任何一种 → 停止。回到 Phase 1。**
125
-
126
- ## 和 Harness 工作流的对齐
127
-
128
- | 调试阶段 | Harness 步骤 |
129
- |---------|-------------|
130
- | Phase 1:根因调查 | Baseline:先验证当前基线,确认 bug 是可复现的 |
131
- | Phase 2:模式分析 | Orient:读相关代码、文档、测试,找参考 |
132
- | Phase 3:假设测试 | Contract:写清修复假设和验证方法 |
133
- | Phase 4:实现 | Implement → Verify(TDD:先写失败测试) |
134
- | Phase 4.5:质疑架构 | 可能需要新的 exec plan |
135
-
136
- ## 快速参考
137
-
138
- | 阶段 | 关键活动 | 成功标准 |
139
- |------|---------|---------|
140
- | 1. 根因 | 读错误、复现、查变更、收集证据 | 理解 WHAT 和 WHY |
141
- | 2. 模式 | 找工作中的例子、对比 | 识别差异 |
142
- | 3. 假设 | 形成理论、最小测试 | 确认或新假设 |
143
- | 4. 实现 | 创建测试、修复、验证 | Bug 解决、测试通过 |
144
-
145
- ## 当流程揭示"无根因"时
146
-
147
- 如果系统性调查揭示问题确实属于环境性、时序性或外部依赖:
148
- 1. 已完成流程(不是跳过)
149
- 2. 记录调查了什么
150
- 3. 实现适当处理(重试、超时、错误提示)
151
- 4. 添加监控/日志供将来调查
152
-
153
- **但是:** 95% 的"无根因"案例是不完整调查。
1
+ # Harness Methodology: Systematic Debugging
2
+
3
+ 从 Superpowers `systematic-debugging` skill 中提取的调试方法,适配本仓库 harness 工作流。
4
+
5
+ ## Iron Law
6
+
7
+ ```
8
+ NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
9
+ ```
10
+
11
+ 没有完成 Phase 1(根因调查),就不能提出任何修复方案。修症状 = 失败。
12
+
13
+ ## 何时使用
14
+
15
+ 适用于任何技术问题:
16
+ - 测试失败
17
+ - 生产 bug
18
+ - 意外行为
19
+ - 性能问题
20
+ - 构建/集成失败
21
+
22
+ **尤其要在以下情况使用:**
23
+ - 时间压力下(紧急情况最容易让人猜)
24
+ - "一个快速修复"看起来很明显
25
+ - 已经试过多次修复
26
+ - 上一个修复没奏效
27
+ - 不完全理解问题
28
+
29
+ ## 四阶段流程
30
+
31
+ 每个阶段必须完成才能进入下一个。
32
+
33
+ ### Phase 1:根因调查
34
+
35
+ **在尝试任何修复之前:**
36
+
37
+ 1. **仔细读错误信息**
38
+ - 不要跳过 error 和 warning
39
+ - 错误信息常常包含精确的解决方案
40
+ - 完整读 stack trace
41
+ - 记下文件名、行号、错误码
42
+
43
+ 2. **稳定复现**
44
+ - 能可靠触发吗?
45
+ - 精确步骤是什么?
46
+ - 每次都发生?
47
+ - 如果不能复现 → 收集更多数据,不要猜
48
+
49
+ 3. **检查最近变更**
50
+ - 什么改动可能导致这个问题?
51
+ - `git diff`、最近提交
52
+ - 新依赖、配置变更
53
+ - 环境差异
54
+
55
+ 4. **多组件系统:收集跨层证据**
56
+
57
+ 当系统涉及多个组件(CI → build → sign, API → service → DB):
58
+ ```
59
+ 对每个组件边界:
60
+ - 记录进入组件的数据
61
+ - 记录离开组件的数据
62
+ - 验证环境/配置传播
63
+ - 检查每层状态
64
+
65
+ 跑一次收集证据 → 分析证据确定失败组件 → 针对该组件调查
66
+ ```
67
+
68
+ 5. **追踪数据流**
69
+
70
+ 当错误在深层调用栈中:
71
+ - 坏值从哪里来?
72
+ - 谁用坏值调用了这里?
73
+ - 持续向上追踪直到源头
74
+ - 在源头修复,不在症状处修复
75
+
76
+ ### Phase 2:模式分析
77
+
78
+ 1. **找工作中的例子** — 在同一个代码库里定位相似的工作代码
79
+ 2. **对照参考实现** — 完整阅读参考实现,不要跳读
80
+ 3. **识别差异** — 列出工作和失败之间的每一项差异,再小也不假设"这不重要"
81
+ 4. **理解依赖** — 需要哪些其他组件、设置、配置、假设?
82
+
83
+ ### Phase 3:假设与测试
84
+
85
+ 1. **形成单一假设** — "我认为 X 是根因,因为 Y"
86
+ 2. **最小测试** — 做最小的改动来测试假设,一次只变一个变量
87
+ 3. **验证后再继续** — 成功了?→ Phase 4。没成功?→ 形成新假设。不要在原假设上叠加更多修复
88
+
89
+ ### Phase 4:实现
90
+
91
+ 1. **创建失败测试用例** — 遵循 RED-GREEN-REFACTOR(见 `docs/harness-methodology-tdd.md`)
92
+ 2. **实现单一修复** — 解决已识别的根因,一次一个改动,不顺手重构
93
+ 3. **验证修复** — 测试通过?其他测试没坏?问题真的解决了?
94
+ 4. **如果修复无效**:
95
+ - 尝试了几个修复?
96
+ - < 3 个 → 回到 Phase 1 重新分析
97
+ - **≥ 3 个 → 停止,质疑架构(Phase 4.5)**
98
+
99
+ ### Phase 4.5:质疑架构
100
+
101
+ **以下模式表明架构问题:**
102
+ - 每次修复暴露新的共享状态/耦合/不同位置的问题
103
+ - 修复需要"大规模重构"才能实现
104
+ - 每次修复在其他地方产生新症状
105
+
106
+ **停止并质疑基础:**
107
+ - 这个模式从根本上正确吗?
108
+ - 我们是否在"靠惯性坚持它"?
109
+ - 是否应该重构架构,而不是继续修症状?
110
+
111
+ 在尝试更多修复之前讨论。
112
+
113
+ ## Red Flags:停止并回到 Phase 1
114
+
115
+ 如果你发现自己这样想:
116
+ - "先快速修一下,后面再调查"
117
+ - "试试改 X 看看行不行"
118
+ - "一次改多个东西然后跑测试"
119
+ - "跳过测试,手工验证就行"
120
+ - "大概就是 X 的问题,直接修吧"
121
+ - "不太确定但可能有用"
122
+ - "再试一个修复"(已经试了 2+ 次)
123
+
124
+ **以上任何一种 → 停止。回到 Phase 1。**
125
+
126
+ ## 和 Harness 工作流的对齐
127
+
128
+ | 调试阶段 | Harness 步骤 |
129
+ |---------|-------------|
130
+ | Phase 1:根因调查 | Baseline:先验证当前基线,确认 bug 是可复现的 |
131
+ | Phase 2:模式分析 | Orient:读相关代码、文档、测试,找参考 |
132
+ | Phase 3:假设测试 | Contract:写清修复假设和验证方法 |
133
+ | Phase 4:实现 | Implement → Verify(TDD:先写失败测试) |
134
+ | Phase 4.5:质疑架构 | 可能需要新的 exec plan |
135
+
136
+ ## 快速参考
137
+
138
+ | 阶段 | 关键活动 | 成功标准 |
139
+ |------|---------|---------|
140
+ | 1. 根因 | 读错误、复现、查变更、收集证据 | 理解 WHAT 和 WHY |
141
+ | 2. 模式 | 找工作中的例子、对比 | 识别差异 |
142
+ | 3. 假设 | 形成理论、最小测试 | 确认或新假设 |
143
+ | 4. 实现 | 创建测试、修复、验证 | Bug 解决、测试通过 |
144
+
145
+ ## 当流程揭示"无根因"时
146
+
147
+ 如果系统性调查揭示问题确实属于环境性、时序性或外部依赖:
148
+ 1. 已完成流程(不是跳过)
149
+ 2. 记录调查了什么
150
+ 3. 实现适当处理(重试、超时、错误提示)
151
+ 4. 添加监控/日志供将来调查
152
+
153
+ **但是:** 95% 的"无根因"案例是不完整调查。
@@ -1,130 +1,130 @@
1
- # Harness Methodology: Test-Driven Development
2
-
3
- 从 Superpowers `test-driven-development` skill 中提取的 TDD 纪律,适配本仓库 harness 工作流。
4
-
5
- ## Iron Law
6
-
7
- ```
8
- NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
9
- ```
10
-
11
- 在测试之前写的任何实现代码,必须在写测试前删除。不是"留作参考"、不是"边写测试边改"——删除就是删除,从零开始实现。
12
-
13
- ## RED-GREEN-REFACTOR 循环
14
-
15
- ### RED:写一个失败测试
16
-
17
- 写一个最小的测试,展示代码应该做什么。
18
-
19
- **要求:**
20
- - 一个行为
21
- - 清晰的命名
22
- - 真实代码(除非不可避免才 mock)
23
-
24
- ```
25
- ✅ test('rejects empty email', async () => {
26
- const result = await submitForm({ email: '' });
27
- expect(result.error).toBe('Email required');
28
- })
29
-
30
- ❌ test('retry works', ...) // 名字模糊
31
- ❌ test('validates email and domain and whitespace') // 一次测太多
32
- ```
33
-
34
- ### Verify RED:看着它失败
35
-
36
- **不可跳过。**
37
-
38
- ```bash
39
- npm test path/to/test.test.ts
40
- ```
41
-
42
- 确认:
43
- - 测试**失败**(不是报错)
44
- - 失败原因是你预期的(因为功能还没实现,而不是拼写错误)
45
- - 测试通过?→ 你在测已有行为,修正测试。测试报错?→ 修复错误,重新跑到真的失败为止。
46
-
47
- ### GREEN:最小实现
48
-
49
- 写刚好能让测试通过的最简单代码。不要加功能、不要重构其他代码、不要"顺手优化"。
50
-
51
- ### Verify GREEN:看着它通过
52
-
53
- **不可跳过。**
54
-
55
- ```bash
56
- npm test path/to/test.test.ts
57
- ```
58
-
59
- 确认:
60
- - 测试通过
61
- - 其他测试依然通过
62
- - 输出干净(无 error、warning)
63
-
64
- ### REFACTOR:清理
65
-
66
- 只在 GREEN 之后:
67
- - 消除重复
68
- - 改善命名
69
- - 提取辅助函数
70
-
71
- 保持测试绿色。不添加行为。
72
-
73
- ## 为什么顺序重要
74
-
75
- **"我先写实现再补测试"** → 实现后写的测试立即通过,这什么都证明不了。你可能测了错误的东西、漏了边界情况、从未见过它抓到 bug。测试先行迫使你看到测试失败,证明它确实在测有意义的东西。
76
-
77
- **"我已经手工测过了"** → 手工测试是临时的。没有记录、不能重跑、压力下容易忘。"刚刚试了能用" ≠ 全面覆盖。自动化测试是系统性的,每次跑得一样。
78
-
79
- **"删掉已写代码太浪费"** → 沉没成本谬误。时间已经花了。现在的选择是:(a) 删掉重写 TDD(X 小时,高信心)vs (b) 保留它然后补测试(30 分钟,低信心,大概率有 bug)。保留不可信的代码才是真正的浪费。
80
-
81
- ## TDD 与 Harness 工作流的对齐
82
-
83
- | TDD 阶段 | Harness 步骤 |
84
- |----------|-------------|
85
- | RED | Contract → 写验收标准(含测试预期) |
86
- | GREEN | Implement → 最小实现 |
87
- | REFACTOR | Verify 通过后可做受控清理 |
88
- | 循环 | 下一个工作块 |
89
-
90
- ## 验证清单
91
-
92
- 在标记工作完成前:
93
-
94
- - [ ] 每个新函数/方法有对应测试
95
- - [ ] 看过每个测试在实现前失败
96
- - [ ] 每个测试因预期原因失败(功能缺失,不是拼写错误)
97
- - [ ] 为每个测试写了最小实现
98
- - [ ] 所有测试通过
99
- - [ ] 输出干净(无 error、warning)
100
- - [ ] 测试使用真实代码(仅在不可避免时 mock)
101
- - [ ] 边界情况和错误路径已覆盖
102
-
103
- 无法勾完所有框 → 跳过了 TDD → 从 RED 重新开始。
104
-
105
- ## 反模式
106
-
107
- - **测试 mock 行为而非真实行为**:mock 只在调用外部 API/DB 等不可避免时使用
108
- - **给生产类加仅测试用的方法**:设计接口应同时对生产者和消费者友好
109
- - **不理解依赖就 mock**:先理解数据流,再 mock
110
-
111
- ## Bug 修复的 TDD
112
-
113
- 发现 bug → 先写复现它的失败测试 → RED-GREEN-REFACTOR → 测试即证明修复有效且防止回归。
114
-
115
- 永远不要在没有测试的情况下修 bug。
116
-
117
- ## 当卡住时
118
-
119
- | 问题 | 解法 |
120
- |------|------|
121
- | 不知道怎么写测试 | 先写期望的 API 调用方式;先写断言 |
122
- | 测试太复杂 | 设计太复杂,简化接口 |
123
- | 必须 mock 一切 | 代码耦合太重,用依赖注入 |
124
- | 测试 setup 巨大 | 提取辅助函数;还是复杂?简化设计 |
125
-
126
- ## 参考
127
-
128
- - Harness 工作流:`docs/feature-workflow.md`
129
- - 验证矩阵:`docs/verification-matrix.md`
130
- - Sprint Contract 模板:`docs/templates/sprint-contract.md`
1
+ # Harness Methodology: Test-Driven Development
2
+
3
+ 从 Superpowers `test-driven-development` skill 中提取的 TDD 纪律,适配本仓库 harness 工作流。
4
+
5
+ ## Iron Law
6
+
7
+ ```
8
+ NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
9
+ ```
10
+
11
+ 在测试之前写的任何实现代码,必须在写测试前删除。不是"留作参考"、不是"边写测试边改"——删除就是删除,从零开始实现。
12
+
13
+ ## RED-GREEN-REFACTOR 循环
14
+
15
+ ### RED:写一个失败测试
16
+
17
+ 写一个最小的测试,展示代码应该做什么。
18
+
19
+ **要求:**
20
+ - 一个行为
21
+ - 清晰的命名
22
+ - 真实代码(除非不可避免才 mock)
23
+
24
+ ```
25
+ ✅ test('rejects empty email', async () => {
26
+ const result = await submitForm({ email: '' });
27
+ expect(result.error).toBe('Email required');
28
+ })
29
+
30
+ ❌ test('retry works', ...) // 名字模糊
31
+ ❌ test('validates email and domain and whitespace') // 一次测太多
32
+ ```
33
+
34
+ ### Verify RED:看着它失败
35
+
36
+ **不可跳过。**
37
+
38
+ ```bash
39
+ npm test path/to/test.test.ts
40
+ ```
41
+
42
+ 确认:
43
+ - 测试**失败**(不是报错)
44
+ - 失败原因是你预期的(因为功能还没实现,而不是拼写错误)
45
+ - 测试通过?→ 你在测已有行为,修正测试。测试报错?→ 修复错误,重新跑到真的失败为止。
46
+
47
+ ### GREEN:最小实现
48
+
49
+ 写刚好能让测试通过的最简单代码。不要加功能、不要重构其他代码、不要"顺手优化"。
50
+
51
+ ### Verify GREEN:看着它通过
52
+
53
+ **不可跳过。**
54
+
55
+ ```bash
56
+ npm test path/to/test.test.ts
57
+ ```
58
+
59
+ 确认:
60
+ - 测试通过
61
+ - 其他测试依然通过
62
+ - 输出干净(无 error、warning)
63
+
64
+ ### REFACTOR:清理
65
+
66
+ 只在 GREEN 之后:
67
+ - 消除重复
68
+ - 改善命名
69
+ - 提取辅助函数
70
+
71
+ 保持测试绿色。不添加行为。
72
+
73
+ ## 为什么顺序重要
74
+
75
+ **"我先写实现再补测试"** → 实现后写的测试立即通过,这什么都证明不了。你可能测了错误的东西、漏了边界情况、从未见过它抓到 bug。测试先行迫使你看到测试失败,证明它确实在测有意义的东西。
76
+
77
+ **"我已经手工测过了"** → 手工测试是临时的。没有记录、不能重跑、压力下容易忘。"刚刚试了能用" ≠ 全面覆盖。自动化测试是系统性的,每次跑得一样。
78
+
79
+ **"删掉已写代码太浪费"** → 沉没成本谬误。时间已经花了。现在的选择是:(a) 删掉重写 TDD(X 小时,高信心)vs (b) 保留它然后补测试(30 分钟,低信心,大概率有 bug)。保留不可信的代码才是真正的浪费。
80
+
81
+ ## TDD 与 Harness 工作流的对齐
82
+
83
+ | TDD 阶段 | Harness 步骤 |
84
+ |----------|-------------|
85
+ | RED | Contract → 写验收标准(含测试预期) |
86
+ | GREEN | Implement → 最小实现 |
87
+ | REFACTOR | Verify 通过后可做受控清理 |
88
+ | 循环 | 下一个工作块 |
89
+
90
+ ## 验证清单
91
+
92
+ 在标记工作完成前:
93
+
94
+ - [ ] 每个新函数/方法有对应测试
95
+ - [ ] 看过每个测试在实现前失败
96
+ - [ ] 每个测试因预期原因失败(功能缺失,不是拼写错误)
97
+ - [ ] 为每个测试写了最小实现
98
+ - [ ] 所有测试通过
99
+ - [ ] 输出干净(无 error、warning)
100
+ - [ ] 测试使用真实代码(仅在不可避免时 mock)
101
+ - [ ] 边界情况和错误路径已覆盖
102
+
103
+ 无法勾完所有框 → 跳过了 TDD → 从 RED 重新开始。
104
+
105
+ ## 反模式
106
+
107
+ - **测试 mock 行为而非真实行为**:mock 只在调用外部 API/DB 等不可避免时使用
108
+ - **给生产类加仅测试用的方法**:设计接口应同时对生产者和消费者友好
109
+ - **不理解依赖就 mock**:先理解数据流,再 mock
110
+
111
+ ## Bug 修复的 TDD
112
+
113
+ 发现 bug → 先写复现它的失败测试 → RED-GREEN-REFACTOR → 测试即证明修复有效且防止回归。
114
+
115
+ 永远不要在没有测试的情况下修 bug。
116
+
117
+ ## 当卡住时
118
+
119
+ | 问题 | 解法 |
120
+ |------|------|
121
+ | 不知道怎么写测试 | 先写期望的 API 调用方式;先写断言 |
122
+ | 测试太复杂 | 设计太复杂,简化接口 |
123
+ | 必须 mock 一切 | 代码耦合太重,用依赖注入 |
124
+ | 测试 setup 巨大 | 提取辅助函数;还是复杂?简化设计 |
125
+
126
+ ## 参考
127
+
128
+ - Harness 工作流:`docs/feature-workflow.md`
129
+ - 验证矩阵:`docs/verification-matrix.md`
130
+ - Sprint Contract 模板:`docs/templates/sprint-contract.md`
@@ -1,27 +1,27 @@
1
- # 验证方法论
2
-
3
- 完成声明需要当前证据。
4
-
5
- ## 门禁函数
6
-
7
- 1. 确定能证明声明的命令
8
- 2. 完整运行该命令
9
- 3. 读输出与 exit code
10
- 4. 修失败或报告确切失败状态
11
- 5. 然后再声明结果
12
-
13
- ## 常见门禁
14
-
15
- | 声明 | 命令 |
16
- |---|---|
17
- | 治理有效 | `bash scripts/check-repo.sh` |
18
- | TypeScript 编译通过 | `npm run typecheck` |
19
- | 行为有覆盖 | `npm test` |
20
- | 完整本地交付有效 | `bash scripts/ci.sh` |
21
-
22
- ## Red Flags
23
-
24
- - 凭意图声明完成
25
- - 依赖陈旧命令输出
26
- - 用窄检查支撑宽声明
27
- - 跳过失败命令的细节
1
+ # 验证方法论
2
+
3
+ 完成声明需要当前证据。
4
+
5
+ ## 门禁函数
6
+
7
+ 1. 确定能证明声明的命令
8
+ 2. 完整运行该命令
9
+ 3. 读输出与 exit code
10
+ 4. 修失败或报告确切失败状态
11
+ 5. 然后再声明结果
12
+
13
+ ## 常见门禁
14
+
15
+ | 声明 | 命令 |
16
+ |---|---|
17
+ | 治理有效 | `bash scripts/check-repo.sh` |
18
+ | TypeScript 编译通过 | `npm run typecheck` |
19
+ | 行为有覆盖 | `npm test` |
20
+ | 完整本地交付有效 | `bash scripts/ci.sh` |
21
+
22
+ ## Red Flags
23
+
24
+ - 凭意图声明完成
25
+ - 依赖陈旧命令输出
26
+ - 用窄检查支撑宽声明
27
+ - 跳过失败命令的细节