@tea-agent/loop-agent 0.13.0 → 0.15.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 (272) hide show
  1. package/AGENTS.md +157 -157
  2. package/CHANGELOG.md +116 -305
  3. package/README.md +357 -334
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/cursor-prompt.js +6 -6
  7. package/dist/commands/init.js +505 -505
  8. package/dist/commands/loop-benchmark.js +11 -11
  9. package/dist/commands/pi-reuse-benchmark.js +16 -16
  10. package/dist/executors/pi-event-serializer.js +33 -11
  11. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  12. package/dist/task/runtime.js +27 -27
  13. package/dist/worker/observe/spec-evidence.js +19 -10
  14. package/dist/worker/observe/static/api.js +46 -46
  15. package/dist/worker/observe/static/app.js +151 -150
  16. package/dist/worker/observe/static/constants.js +156 -148
  17. package/dist/worker/observe/static/copy.js +67 -67
  18. package/dist/worker/observe/static/dag-helpers.js +201 -172
  19. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  20. package/dist/worker/observe/static/dag-layout.js +83 -83
  21. package/dist/worker/observe/static/dag-model.js +72 -72
  22. package/dist/worker/observe/static/dom.js +122 -122
  23. package/dist/worker/observe/static/format-pool.d.ts +71 -0
  24. package/dist/worker/observe/static/format-pool.js +134 -67
  25. package/dist/worker/observe/static/format.js +317 -292
  26. package/dist/worker/observe/static/index.html +350 -308
  27. package/dist/worker/observe/static/kpi.js +100 -94
  28. package/dist/worker/observe/static/markdown-render.js +124 -0
  29. package/dist/worker/observe/static/relations.js +133 -133
  30. package/dist/worker/observe/static/router.js +93 -93
  31. package/dist/worker/observe/static/run-processing.js +148 -148
  32. package/dist/worker/observe/static/shell-chrome.js +74 -68
  33. package/dist/worker/observe/static/state.js +273 -267
  34. package/dist/worker/observe/static/styles.css +2504 -1902
  35. package/dist/worker/observe/static/views/batch.js +227 -227
  36. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  37. package/dist/worker/observe/static/views/dag-inspector.js +530 -627
  38. package/dist/worker/observe/static/views/dag.js +371 -371
  39. package/dist/worker/observe/static/views/dashboard.js +86 -100
  40. package/dist/worker/observe/static/views/failures.js +143 -143
  41. package/dist/worker/observe/static/views/feature.js +492 -492
  42. package/dist/worker/observe/static/views/pool.js +708 -350
  43. package/dist/worker/observe/static/views/run.js +453 -453
  44. package/dist/worker/observe/static/views/session-timeline.js +771 -219
  45. package/dist/worker/observe/static/views/shell.js +7 -7
  46. package/dist/worker/observe/static/views/task.js +314 -314
  47. package/dist/worker/observe/static/views/timeline.js +163 -163
  48. package/dist/workflows/dag/canvas-observer.js +275 -275
  49. package/dist/workflows/dag/init-hybrid.js +27 -11
  50. package/docs/README.md +106 -104
  51. package/docs/architecture/README.md +26 -26
  52. package/docs/architecture/dag-execution.md +140 -140
  53. package/docs/architecture/evolution.md +54 -54
  54. package/docs/architecture/facts-and-state.md +71 -71
  55. package/docs/architecture/runtime-boundaries.md +191 -191
  56. package/docs/architecture/system-overview.md +93 -93
  57. package/docs/architecture/worker-and-feature.md +85 -85
  58. package/docs/harness-methodology-debugging.md +153 -153
  59. package/docs/harness-methodology-tdd.md +130 -130
  60. package/docs/harness-methodology-verification.md +27 -27
  61. package/docs/init-surface.manifest.json +304 -307
  62. package/docs/skills/README.md +7 -7
  63. package/docs/skills/vetted-skill-registry.md +29 -29
  64. package/docs/templates/adr.md +60 -60
  65. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  66. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  67. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  68. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  69. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  70. package/docs/templates/agent-dag-report.schema.json +473 -473
  71. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  72. package/docs/templates/agent-dag.base.json +190 -190
  73. package/docs/templates/agent-dag.final-verification.json +185 -185
  74. package/docs/templates/agent-dag.schema.json +411 -411
  75. package/docs/templates/agent-dag.supervised-implementation.json +620 -620
  76. package/docs/templates/backend-test-analysis.schema.json +44 -44
  77. package/docs/templates/backend-test-case-manifest.schema.json +190 -190
  78. package/docs/templates/backend-test-dag.classify.prompt.md +75 -75
  79. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -204
  80. package/docs/templates/backend-test-dag.json +559 -559
  81. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -139
  82. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -83
  83. package/docs/templates/backend-test-execution.schema.json +133 -133
  84. package/docs/templates/backend-test-result.schema.json +99 -99
  85. package/docs/templates/branch-merge-report.md +0 -1
  86. package/docs/templates/exec-plan.md +64 -64
  87. package/docs/templates/feature-spec.md +53 -53
  88. package/docs/templates/frontend-design-contract.md +42 -42
  89. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
  90. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
  91. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
  92. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
  93. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
  94. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
  95. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
  96. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
  97. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
  98. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
  99. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
  100. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
  101. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
  102. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
  103. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
  104. package/docs/templates/frontend-eval/metrics.md +138 -138
  105. package/docs/templates/frontend-eval/smoke-targets.md +53 -53
  106. package/docs/templates/frontend-implementation-contract.schema.json +27 -27
  107. package/docs/templates/frontend-task-constraints.md +35 -35
  108. package/docs/templates/frontend-task-requirement.md +70 -70
  109. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  110. package/docs/templates/frontend-test-dag.json +23 -23
  111. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  112. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  113. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  114. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  115. package/docs/templates/harness.schema.json +221 -221
  116. package/docs/templates/hybrid-dag.json +188 -188
  117. package/docs/templates/init-evolution-review.md +35 -35
  118. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  119. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  120. package/docs/templates/knowledge-sync-dag.json +178 -178
  121. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  122. package/docs/templates/product-line/AGENTS.md +8 -8
  123. package/docs/templates/product-line/README.md +9 -9
  124. package/docs/templates/product-line/acceptance.yaml +14 -14
  125. package/docs/templates/product-line/closeout.yaml +9 -9
  126. package/docs/templates/product-line/design.md +13 -13
  127. package/docs/templates/product-line/links.md +10 -10
  128. package/docs/templates/product-line/requirement.md +17 -17
  129. package/docs/templates/product-line/task-graph.yaml +15 -15
  130. package/docs/templates/product-line/task.yaml +64 -64
  131. package/docs/templates/product-line/test-plan.md +7 -7
  132. package/docs/templates/production-readiness-checklist.md +57 -57
  133. package/docs/templates/progress-log.md +17 -17
  134. package/docs/templates/project-start-checklist.md +9 -9
  135. package/docs/templates/qa-report.md +48 -48
  136. package/docs/templates/sprint-contract.md +29 -29
  137. package/docs/templates/worker-dogfood-evidence.md +80 -80
  138. package/docs/templates/worker-dogfood-setup.md +68 -68
  139. package/examples/decision-gate-agent-dag.json +173 -173
  140. package/examples/example-dag.json +46 -46
  141. package/examples/hybrid-loop-agent-dag.json +188 -188
  142. package/harness.json +66 -66
  143. package/package.json +78 -52
  144. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  145. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  146. package/scripts/kb-graph-materialize.mjs +105 -105
  147. package/scripts/kb-graph-promote.mjs +164 -164
  148. package/scripts/kb-query.mjs +554 -554
  149. package/skills/agent-worker/SKILL.md +39 -39
  150. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  151. package/skills/ai-engineering-context/SKILL.md +48 -48
  152. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  153. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  154. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  155. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  156. package/skills/analyze-product-dependencies/references/example.md +76 -76
  157. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  158. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  159. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  160. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  161. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  162. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  163. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  164. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  165. package/skills/analyze-product-requirements/SKILL.md +90 -90
  166. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  167. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  168. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  169. package/skills/analyze-product-requirements/references/example.md +86 -86
  170. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  171. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  172. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  173. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  174. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  175. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  176. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  177. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  178. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  179. package/skills/browser-tools/SKILL.md +196 -196
  180. package/skills/browser-tools/browser-content.js +103 -103
  181. package/skills/browser-tools/browser-cookies.js +35 -35
  182. package/skills/browser-tools/browser-eval.js +53 -53
  183. package/skills/browser-tools/browser-hn-scraper.js +108 -108
  184. package/skills/browser-tools/browser-nav.js +44 -44
  185. package/skills/browser-tools/browser-pick.js +162 -162
  186. package/skills/browser-tools/browser-screenshot.js +34 -34
  187. package/skills/browser-tools/browser-start.js +86 -86
  188. package/skills/browser-tools/package-lock.json +2556 -2556
  189. package/skills/browser-tools/package.json +19 -19
  190. package/skills/code-review-core/SKILL.md +20 -20
  191. package/skills/codebase-scout/SKILL.md +19 -19
  192. package/skills/frontend-design-review/SKILL.md +66 -66
  193. package/skills/frontend-design-review/references/review-checklist.md +40 -58
  194. package/skills/frontend-implementation/SKILL.md +49 -49
  195. package/skills/frontend-implementation/references/code-standards.md +32 -32
  196. package/skills/frontend-implementation/references/design-spec.md +46 -46
  197. package/skills/frontend-implementation/references/node-contracts.md +27 -27
  198. package/skills/frontend-review/SKILL.md +61 -59
  199. package/skills/frontend-review/references/review-findings.md +48 -47
  200. package/skills/frontend-verification/SKILL.md +55 -53
  201. package/skills/frontend-verification/references/verification-checklist.md +59 -68
  202. package/skills/grill-me/SKILL.md +10 -10
  203. package/skills/grill-with-docs/SKILL.md +88 -88
  204. package/skills/grill-with-docs/adr-format.md +47 -47
  205. package/skills/grill-with-docs/context-format.md +60 -60
  206. package/skills/init-capability-evolution/SKILL.md +70 -70
  207. package/skills/loop-agent/SKILL.md +151 -151
  208. package/skills/loop-agent/references/README.md +67 -67
  209. package/skills/loop-agent/references/command-reference.md +527 -527
  210. package/skills/loop-agent/references/docs-converge.md +126 -126
  211. package/skills/loop-agent/references/harness-policy.md +263 -263
  212. package/skills/loop-agent/references/hybrid-dag.md +243 -243
  213. package/skills/loop-agent/references/learned/README.md +21 -21
  214. package/skills/loop-agent/references/long-running-loop.md +57 -57
  215. package/skills/loop-agent/references/model-routing.md +36 -36
  216. package/skills/loop-agent/references/multi-worktree.md +54 -54
  217. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  218. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  219. package/skills/loop-agent/references/pi-prompt.md +23 -23
  220. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  221. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  222. package/skills/loop-agent/references/task-workflow.md +89 -89
  223. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -141
  224. package/skills/playwright-cli/SKILL.md +420 -420
  225. package/skills/playwright-cli/references/element-attributes.md +23 -23
  226. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  227. package/skills/playwright-cli/references/request-mocking.md +87 -87
  228. package/skills/playwright-cli/references/running-code.md +241 -241
  229. package/skills/playwright-cli/references/session-management.md +225 -225
  230. package/skills/playwright-cli/references/storage-state.md +275 -275
  231. package/skills/playwright-cli/references/test-generation.md +433 -433
  232. package/skills/playwright-cli/references/tracing.md +139 -139
  233. package/skills/playwright-cli/references/video-recording.md +143 -143
  234. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  235. package/skills/requesting-code-review/SKILL.md +101 -101
  236. package/skills/requesting-code-review/code-reviewer.md +168 -168
  237. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  238. package/skills/systematic-debugging/SKILL.md +296 -296
  239. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  240. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  241. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  242. package/skills/systematic-debugging/find-polluter.sh +63 -63
  243. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  244. package/skills/systematic-debugging/test-academic.md +14 -14
  245. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  246. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  247. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  248. package/skills/test-driven-development/SKILL.md +20 -20
  249. package/skills/using-git-worktrees/SKILL.md +215 -215
  250. package/skills/verification-before-completion/SKILL.md +154 -154
  251. package/skills/webapp-testing/SKILL.md +19 -19
  252. package/docs/agent-dag-recovery-playbook.md +0 -195
  253. package/docs/agent-dag-runner.md +0 -67
  254. package/docs/cursor-prompt-sidecar.md +0 -36
  255. package/docs/decisions/README.md +0 -18
  256. package/docs/design/README.md +0 -167
  257. package/docs/development-principles.md +0 -73
  258. package/docs/exec-plans/README.md +0 -6
  259. package/docs/exec-plans/active/README.md +0 -12
  260. package/docs/exec-plans/completed/README.md +0 -107
  261. package/docs/feature-workflow.md +0 -414
  262. package/docs/loop-agent-harness.md +0 -142
  263. package/docs/production-readiness.md +0 -96
  264. package/docs/progress/README.md +0 -80
  265. package/docs/reports/README.md +0 -159
  266. package/docs/verification-matrix.md +0 -70
  267. package/scripts/check-product-line-docs.sh +0 -29
  268. package/scripts/check-task-pool-root.sh +0 -32
  269. package/scripts/kb-graph-incremental-prepare.sh +0 -5
  270. package/scripts/kb-graph-materialize.sh +0 -4
  271. package/scripts/kb-graph-promote.sh +0 -4
  272. package/scripts/kb-query.sh +0 -5
@@ -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 工作流:`feature-workflow.md`
129
- - 验证矩阵:`verification-matrix.md`
130
- - Sprint Contract 模板:`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 工作流:`feature-workflow.md`
129
+ - 验证矩阵:`verification-matrix.md`
130
+ - Sprint Contract 模板:`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
+ - 跳过失败命令的细节