specops 0.2.2 → 0.2.4

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 (62) hide show
  1. package/.opencode/agent/demand-analyst.md +69 -18
  2. package/.opencode/agent/verifier.md +231 -0
  3. package/.opencode/skills/brainstorming/SKILL.md +105 -0
  4. package/.opencode/skills/demand-analysis/SKILL.md +261 -47
  5. package/.opencode/skills/dispatching-parallel-agents/SKILL.md +180 -0
  6. package/.opencode/skills/executing-plans/SKILL.md +90 -0
  7. package/.opencode/skills/finishing-a-development-branch/SKILL.md +222 -0
  8. package/.opencode/skills/receiving-code-review/SKILL.md +213 -0
  9. package/.opencode/skills/repo-clone-analyze/SKILL.md +371 -0
  10. package/.opencode/skills/requesting-code-review/SKILL.md +105 -0
  11. package/.opencode/skills/requesting-code-review/code-reviewer.md +146 -0
  12. package/.opencode/skills/subagent-driven-development/SKILL.md +242 -0
  13. package/.opencode/skills/subagent-driven-development/code-quality-reviewer-prompt.md +20 -0
  14. package/.opencode/skills/subagent-driven-development/implementer-prompt.md +78 -0
  15. package/.opencode/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  16. package/.opencode/skills/systematic-debugging/SKILL.md +296 -0
  17. package/.opencode/skills/systematic-debugging/condition-based-waiting.md +115 -0
  18. package/.opencode/skills/systematic-debugging/defense-in-depth.md +122 -0
  19. package/.opencode/skills/systematic-debugging/root-cause-tracing.md +169 -0
  20. package/.opencode/skills/test-driven-development/SKILL.md +399 -0
  21. package/.opencode/skills/test-driven-development/testing-anti-patterns.md +299 -0
  22. package/.opencode/skills/using-git-worktrees/SKILL.md +218 -0
  23. package/.opencode/skills/using-superpowers/SKILL.md +99 -0
  24. package/.opencode/skills/verification-before-completion/SKILL.md +150 -0
  25. package/.opencode/skills/writing-plans/SKILL.md +123 -0
  26. package/.opencode/skills/writing-skills/SKILL.md +654 -0
  27. package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
  28. package/dist/acceptance/lazyDetector.js +1 -1
  29. package/dist/acceptance/lazyDetector.test.js +1 -1
  30. package/dist/acceptance/reporter.js +1 -1
  31. package/dist/acceptance/reporter.test.js +1 -1
  32. package/dist/acceptance/runner.js +1 -1
  33. package/dist/acceptance/runner.test.js +1 -1
  34. package/dist/cli.js +1 -1
  35. package/dist/context/index.js +1 -1
  36. package/dist/context/promptTemplate.js +1 -1
  37. package/dist/context/promptTemplate.test.js +1 -1
  38. package/dist/context/techContextLoader.js +1 -1
  39. package/dist/context/techContextLoader.test.js +1 -1
  40. package/dist/engine.js +1 -1
  41. package/dist/evolution/distiller.js +1 -1
  42. package/dist/evolution/index.js +1 -1
  43. package/dist/evolution/memoryGraph.js +1 -1
  44. package/dist/evolution/selector.js +1 -1
  45. package/dist/evolution/signals.js +1 -1
  46. package/dist/evolution/solidify.js +1 -1
  47. package/dist/evolution/store.js +1 -1
  48. package/dist/evolution/types.js +1 -1
  49. package/dist/init.js +1 -1
  50. package/dist/machines/agentMachine.js +1 -1
  51. package/dist/machines/agentMachine.test.js +1 -1
  52. package/dist/machines/supervisorMachine.js +1 -1
  53. package/dist/machines/supervisorMachine.test.js +1 -1
  54. package/dist/persistence/schema.js +1 -1
  55. package/dist/persistence/stateFile.js +1 -1
  56. package/dist/persistence/stateFile.test.js +1 -1
  57. package/dist/plugin-engine.js +1 -1
  58. package/dist/plugin.js +1 -1
  59. package/dist/types/index.js +1 -1
  60. package/dist/utils/id.js +1 -1
  61. package/package.json +8 -2
  62. package/scripts/postinstall.mjs +37 -7
@@ -0,0 +1,654 @@
1
+ ---
2
+ name: writing-skills
3
+ description: 创建新 skill、编辑现有 skill 或在部署前验证 skill 是否有效时使用
4
+ ---
5
+
6
+ # 编写 Skill
7
+
8
+ ## 概述
9
+
10
+ **编写 skill 就是把测试驱动开发应用到流程文档上。**
11
+
12
+ **个人 skill 放在 `.opencode/skills/<skill名>/SKILL.md`**
13
+
14
+ 你写测试用例(用子 agent 的压力场景),看它们失败(基线行为),写 skill(文档),看测试通过(agent 遵守),然后重构(堵住漏洞)。
15
+
16
+ **核心原则:** 如果你没有看到 agent 在没有 skill 的情况下失败,你就不知道 skill 是否教了正确的东西。
17
+
18
+ **必要背景:** 你必须理解 specops:test-driven-development 才能使用这个 skill。那个 skill 定义了基本的红-绿-重构循环。这个 skill 把 TDD 适配到文档上。
19
+
20
+ **官方指南:** 关于 Anthropic 官方的 skill 编写最佳实践,参见 anthropic-best-practices.md。本文档提供了补充 TDD 方法的额外模式和指南。
21
+
22
+ ## 什么是 Skill?
23
+
24
+ **skill** 是经过验证的技术、模式或工具的参考指南。Skill 帮助未来的 Claude 实例找到并应用有效的方法。
25
+
26
+ **Skill 是:** 可复用的技术、模式、工具、参考指南
27
+
28
+ **Skill 不是:** 关于你某次如何解决问题的叙事
29
+
30
+ ## TDD 映射到 Skill 创建
31
+
32
+ | TDD 概念 | Skill 创建 |
33
+ |-----------|-----------|
34
+ | **测试用例** | 用子 agent 的压力场景 |
35
+ | **生产代码** | Skill 文档(SKILL.md) |
36
+ | **测试失败(红灯)** | Agent 在没有 skill 时违反规则(基线) |
37
+ | **测试通过(绿灯)** | Agent 在有 skill 时遵守规则 |
38
+ | **重构** | 堵住漏洞同时保持合规 |
39
+ | **先写测试** | 在写 skill 之前运行基线场景 |
40
+ | **看它失败** | 记录 agent 使用的确切合理化借口 |
41
+ | **最少代码** | 写 skill 针对那些具体的违规 |
42
+ | **看它通过** | 验证 agent 现在遵守了 |
43
+ | **重构循环** | 发现新的合理化借口 → 堵住 → 重新验证 |
44
+
45
+ 整个 skill 创建过程遵循红-绿-重构。
46
+
47
+ ## 何时创建 Skill
48
+
49
+ **创建条件:**
50
+ - 技术对你来说不是直觉上显而易见的
51
+ - 你会在不同项目中再次引用它
52
+ - 模式广泛适用(不是项目特定的)
53
+ - 其他人会受益
54
+
55
+ **不要创建:**
56
+ - 一次性解决方案
57
+ - 其他地方有良好文档的标准实践
58
+ - 项目特定的约定(放在 CLAUDE.md 中)
59
+ - 机械约束(如果能用正则/验证自动化,就自动化,文档留给需要判断的事情)
60
+
61
+ ## Skill 类型
62
+
63
+ ### 技术
64
+ 有具体步骤的方法(condition-based-waiting、root-cause-tracing)
65
+
66
+ ### 模式
67
+ 思考问题的方式(flatten-with-flags、test-invariants)
68
+
69
+ ### 参考
70
+ API 文档、语法指南、工具文档(office docs)
71
+
72
+ ## 目录结构
73
+
74
+ ```
75
+ skills/
76
+ skill-name/
77
+ SKILL.md # 主参考文档(必需)
78
+ supporting-file.* # 仅在需要时
79
+ ```
80
+
81
+ **扁平命名空间** - 所有 skill 在一个可搜索的命名空间中
82
+
83
+ **单独文件用于:**
84
+ 1. **大量参考内容**(100+ 行)- API 文档、全面的语法
85
+ 2. **可复用工具** - 脚本、工具、模板
86
+
87
+ **保持内联:**
88
+ - 原则和概念
89
+ - 代码模式(< 50 行)
90
+ - 其他所有内容
91
+
92
+ ## SKILL.md 结构
93
+
94
+ **Frontmatter(YAML):**
95
+ - 只支持两个字段:`name` 和 `description`
96
+ - 总共最多 1024 个字符
97
+ - `name`:只使用字母、数字和连字符(不要括号、特殊字符)
98
+ - `description`:第三人称,只描述何时使用(不是它做什么)
99
+ - 以"...时使用"开头,聚焦触发条件
100
+ - 包含具体的症状、情况和上下文
101
+ - **绝不总结 skill 的流程或工作流**(见 CSO 部分了解原因)
102
+ - 尽量控制在 500 字符以内
103
+
104
+ ```markdown
105
+ ---
106
+ name: Skill-Name-With-Hyphens
107
+ description: [具体触发条件和症状]时使用
108
+ ---
109
+
110
+ # Skill 名称
111
+
112
+ ## 概述
113
+ 这是什么?核心原则用 1-2 句话。
114
+
115
+ ## 何时使用
116
+ [如果决策不明显,用小型内联流程图]
117
+
118
+ 症状和用例的要点列表
119
+ 何时不使用
120
+
121
+ ## 核心模式(用于技术/模式类)
122
+ 前后代码对比
123
+
124
+ ## 快速参考
125
+ 表格或要点,方便扫描常见操作
126
+
127
+ ## 实现
128
+ 简单模式内联代码
129
+ 大量参考或可复用工具链接到文件
130
+
131
+ ## 常见错误
132
+ 什么会出错 + 修复方法
133
+
134
+ ## 真实世界的影响(可选)
135
+ 具体结果
136
+ ```
137
+
138
+
139
+ ## Claude 搜索优化(CSO)
140
+
141
+ **对发现至关重要:** 未来的 Claude 需要能找到你的 skill
142
+
143
+ ### 1. 丰富的 Description 字段
144
+
145
+ **目的:** Claude 读取 description 来决定为给定任务加载哪些 skill。让它回答:"我现在应该读这个 skill 吗?"
146
+
147
+ **格式:** 以"...时使用"开头,聚焦触发条件
148
+
149
+ **关键:Description = 何时使用,不是 Skill 做什么**
150
+
151
+ Description 应该只描述触发条件。不要在 description 中总结 skill 的流程或工作流。
152
+
153
+ **为什么这很重要:** 测试发现,当 description 总结了 skill 的工作流时,Claude 可能会按照 description 行事而不是阅读完整的 skill 内容。一个说"任务之间做代码审查"的 description 导致 Claude 只做了一次审查,尽管 skill 的流程图清楚地显示了两次审查(规格合规性检查,然后代码质量检查)。
154
+
155
+ 当 description 改为只说"在当前会话中执行有独立任务的实现计划时使用"(没有工作流总结)时,Claude 正确地阅读了流程图并遵循了两阶段审查流程。
156
+
157
+ **陷阱:** 总结工作流的 description 创建了 Claude 会走的捷径。Skill 正文变成了 Claude 跳过的文档。
158
+
159
+ ```yaml
160
+ # ❌ 坏:总结了工作流 - Claude 可能按这个行事而不是读 skill
161
+ description: 执行计划时使用 - 每个任务分派子 agent 并在任务之间做代码审查
162
+
163
+ # ❌ 坏:太多流程细节
164
+ description: TDD 时使用 - 先写测试,看它失败,写最少代码,重构
165
+
166
+ # ✅ 好:只有触发条件,没有工作流总结
167
+ description: 在当前会话中执行有独立任务的实现计划时使用
168
+
169
+ # ✅ 好:只有触发条件
170
+ description: 实现任何功能或修复bug之前使用,在编写实现代码之前
171
+ ```
172
+
173
+ **内容:**
174
+ - 使用具体的触发器、症状和表明此 skill 适用的情况
175
+ - 描述问题(竞态条件、不一致行为)而不是语言特定的症状(setTimeout、sleep)
176
+ - 保持触发器技术无关,除非 skill 本身是技术特定的
177
+ - 如果 skill 是技术特定的,在触发器中明确说明
178
+ - 用第三人称写(注入到系统提示中)
179
+ - **绝不总结 skill 的流程或工作流**
180
+
181
+ ```yaml
182
+ # ❌ 坏:太抽象、模糊,没有包含何时使用
183
+ description: 用于异步测试
184
+
185
+ # ❌ 坏:第一人称
186
+ description: 当异步测试不稳定时我可以帮你
187
+
188
+ # ❌ 坏:提到了技术但 skill 不是特定于它的
189
+ description: 当测试使用 setTimeout/sleep 且不稳定时使用
190
+
191
+ # ✅ 好:以"...时使用"开头,描述问题,没有工作流
192
+ description: 当测试有竞态条件、时序依赖或通过/失败不一致时使用
193
+
194
+ # ✅ 好:技术特定的 skill 有明确的触发器
195
+ description: 使用 React Router 处理认证重定向时使用
196
+ ```
197
+
198
+ ### 2. 关键词覆盖
199
+
200
+ 使用 Claude 会搜索的词:
201
+ - 错误信息:"Hook timed out"、"ENOTEMPTY"、"race condition"
202
+ - 症状:"flaky"、"hanging"、"zombie"、"pollution"
203
+ - 同义词:"timeout/hang/freeze"、"cleanup/teardown/afterEach"
204
+ - 工具:实际命令、库名、文件类型
205
+
206
+ ### 3. 描述性命名
207
+
208
+ **使用主动语态,动词在前:**
209
+ - ✅ `creating-skills` 而不是 `skill-creation`
210
+ - ✅ `condition-based-waiting` 而不是 `async-test-helpers`
211
+
212
+ ### 4. Token 效率(关键)
213
+
214
+ **问题:** getting-started 和频繁引用的 skill 加载到每个对话中。每个 token 都很重要。
215
+
216
+ **目标字数:**
217
+ - getting-started 工作流:每个 <150 词
218
+ - 频繁加载的 skill:总共 <200 词
219
+ - 其他 skill:<500 词(仍然要简洁)
220
+
221
+ **技巧:**
222
+
223
+ **把细节移到工具帮助中:**
224
+ ```bash
225
+ # ❌ 坏:在 SKILL.md 中记录所有标志
226
+ search-conversations 支持 --text, --both, --after DATE, --before DATE, --limit N
227
+
228
+ # ✅ 好:引用 --help
229
+ search-conversations 支持多种模式和过滤器。运行 --help 了解详情。
230
+ ```
231
+
232
+ **使用交叉引用:**
233
+ ```markdown
234
+ # ❌ 坏:重复工作流细节
235
+ 搜索时,用模板分派子 agent...
236
+ [20 行重复的指令]
237
+
238
+ # ✅ 好:引用其他 skill
239
+ 始终使用子 agent(节省 50-100 倍上下文)。必须:使用 [other-skill-name] 的工作流。
240
+ ```
241
+
242
+ **压缩示例:**
243
+ ```markdown
244
+ # ❌ 坏:冗长的示例(42 词)
245
+ 你的人类搭档:"我们之前在 React Router 中怎么处理认证错误的?"
246
+ 你:我会搜索过去的对话,找 React Router 认证模式。
247
+ [用搜索查询分派子 agent:"React Router authentication error handling 401"]
248
+
249
+ # ✅ 好:最小示例(20 词)
250
+ 搭档:"我们之前怎么处理 React Router 的认证错误?"
251
+ 你:搜索中...
252
+ [分派子 agent → 综合]
253
+ ```
254
+
255
+ **消除冗余:**
256
+ - 不要重复交叉引用的 skill 中已有的内容
257
+ - 不要解释命令本身就能说明的东西
258
+ - 不要包含同一模式的多个示例
259
+
260
+ **验证:**
261
+ ```bash
262
+ wc -w skills/path/SKILL.md
263
+ # getting-started 工作流:目标每个 <150
264
+ # 其他频繁加载的:目标总共 <200
265
+ ```
266
+
267
+ **用你做什么或核心洞察来命名:**
268
+ - ✅ `condition-based-waiting` > `async-test-helpers`
269
+ - ✅ `using-skills` 而不是 `skill-usage`
270
+ - ✅ `flatten-with-flags` > `data-structure-refactoring`
271
+ - ✅ `root-cause-tracing` > `debugging-techniques`
272
+
273
+ **动名词(-ing)适合描述过程:**
274
+ - `creating-skills`、`testing-skills`、`debugging-with-logs`
275
+ - 主动的,描述你正在做的动作
276
+
277
+ ### 4. 交叉引用其他 Skill
278
+
279
+ **当编写引用其他 skill 的文档时:**
280
+
281
+ 只使用 skill 名称,带明确的要求标记:
282
+ - ✅ 好:`**必需子 SKILL:** 使用 specops:test-driven-development`
283
+ - ✅ 好:`**必要背景:** 你必须理解 specops:systematic-debugging`
284
+ - ❌ 坏:`参见 skills/testing/test-driven-development`(不清楚是否必需)
285
+ - ❌ 坏:`@skills/testing/test-driven-development/SKILL.md`(强制加载,消耗上下文)
286
+
287
+ **为什么不用 @ 链接:** `@` 语法会立即强制加载文件,在你需要之前就消耗 200k+ 上下文。
288
+
289
+ ## 流程图使用
290
+
291
+ ```dot
292
+ digraph when_flowchart {
293
+ "需要展示信息?" [shape=diamond];
294
+ "可能走错的决策?" [shape=diamond];
295
+ "使用 markdown" [shape=box];
296
+ "小型内联流程图" [shape=box];
297
+
298
+ "需要展示信息?" -> "可能走错的决策?" [label="是"];
299
+ "可能走错的决策?" -> "小型内联流程图" [label="是"];
300
+ "可能走错的决策?" -> "使用 markdown" [label="否"];
301
+ }
302
+ ```
303
+
304
+ **只在以下情况使用流程图:**
305
+ - 不明显的决策点
306
+ - 可能过早停止的流程循环
307
+ - "何时用 A vs B"的决策
308
+
309
+ **绝不用流程图表示:**
310
+ - 参考材料 → 表格、列表
311
+ - 代码示例 → Markdown 代码块
312
+ - 线性指令 → 编号列表
313
+ - 没有语义含义的标签(step1、helper2)
314
+
315
+ 参见 @graphviz-conventions.dot 了解 graphviz 样式规则。
316
+
317
+ **为你的人类搭档可视化:** 使用本目录中的 `render-graphs.js` 将 skill 的流程图渲染为 SVG:
318
+ ```bash
319
+ ./render-graphs.js ../some-skill # 每个图单独渲染
320
+ ./render-graphs.js ../some-skill --combine # 所有图合并到一个 SVG
321
+ ```
322
+
323
+ ## 代码示例
324
+
325
+ **一个优秀的示例胜过许多平庸的**
326
+
327
+ 选择最相关的语言:
328
+ - 测试技术 → TypeScript/JavaScript
329
+ - 系统调试 → Shell/Python
330
+ - 数据处理 → Python
331
+
332
+ **好的示例:**
333
+ - 完整且可运行
334
+ - 注释良好,解释为什么
335
+ - 来自真实场景
336
+ - 清晰展示模式
337
+ - 可以直接改编(不是通用模板)
338
+
339
+ **不要:**
340
+ - 用 5 种以上语言实现
341
+ - 创建填空模板
342
+ - 写人造的示例
343
+
344
+ 你擅长移植,一个好示例就够了。
345
+
346
+ ## 文件组织
347
+
348
+ ### 自包含 Skill
349
+ ```
350
+ defense-in-depth/
351
+ SKILL.md # 所有内容内联
352
+ ```
353
+ 适用场景:所有内容都能放下,不需要大量参考
354
+
355
+ ### 带可复用工具的 Skill
356
+ ```
357
+ condition-based-waiting/
358
+ SKILL.md # 概述 + 模式
359
+ example.ts # 可改编的工作辅助函数
360
+ ```
361
+ 适用场景:工具是可复用代码,不只是叙述
362
+
363
+ ### 带大量参考的 Skill
364
+ ```
365
+ pptx/
366
+ SKILL.md # 概述 + 工作流
367
+ pptxgenjs.md # 600 行 API 参考
368
+ ooxml.md # 500 行 XML 结构
369
+ scripts/ # 可执行工具
370
+ ```
371
+ 适用场景:参考材料太大无法内联
372
+
373
+ ## 铁律(与 TDD 相同)
374
+
375
+ ```
376
+ 没有先写失败测试,就不能写 SKILL
377
+ ```
378
+
379
+ 这适用于新 skill 和对现有 skill 的编辑。
380
+
381
+ 先写了 skill 再测试?删掉。从头来过。
382
+ 编辑 skill 没有测试?同样违规。
383
+
384
+ **没有例外:**
385
+ - 不适用于"简单的添加"
386
+ - 不适用于"只是加个章节"
387
+ - 不适用于"文档更新"
388
+ - 不要把未测试的变更留作"参考"
389
+ - 不要在运行测试时"改编"
390
+ - 删除就是删除
391
+
392
+ **必要背景:** specops:test-driven-development skill 解释了为什么这很重要。同样的原则适用于文档。
393
+
394
+ ## 测试所有 Skill 类型
395
+
396
+ 不同的 skill 类型需要不同的测试方法:
397
+
398
+ ### 纪律执行类 Skill(规则/要求)
399
+
400
+ **示例:** TDD、verification-before-completion、designing-before-coding
401
+
402
+ **测试方法:**
403
+ - 学术问题:他们理解规则吗?
404
+ - 压力场景:他们在压力下遵守吗?
405
+ - 多重压力组合:时间 + 沉没成本 + 疲劳
406
+ - 识别合理化借口并添加明确的反驳
407
+
408
+ **成功标准:** Agent 在最大压力下遵守规则
409
+
410
+ ### 技术类 Skill(操作指南)
411
+
412
+ **示例:** condition-based-waiting、root-cause-tracing、defensive-programming
413
+
414
+ **测试方法:**
415
+ - 应用场景:他们能正确应用技术吗?
416
+ - 变体场景:他们能处理边界情况吗?
417
+ - 信息缺失测试:指令有没有空白?
418
+
419
+ **成功标准:** Agent 成功将技术应用到新场景
420
+
421
+ ### 模式类 Skill(心智模型)
422
+
423
+ **示例:** reducing-complexity、information-hiding concepts
424
+
425
+ **测试方法:**
426
+ - 识别场景:他们能识别模式何时适用吗?
427
+ - 应用场景:他们能使用心智模型吗?
428
+ - 反例:他们知道何时不应用吗?
429
+
430
+ **成功标准:** Agent 正确识别何时/如何应用模式
431
+
432
+ ### 参考类 Skill(文档/API)
433
+
434
+ **示例:** API 文档、命令参考、库指南
435
+
436
+ **测试方法:**
437
+ - 检索场景:他们能找到正确的信息吗?
438
+ - 应用场景:他们能正确使用找到的信息吗?
439
+ - 空白测试:常见用例是否被覆盖?
440
+
441
+ **成功标准:** Agent 找到并正确应用参考信息
442
+
443
+ ## 跳过测试的常见合理化借口
444
+
445
+ | 借口 | 现实 |
446
+ |------|------|
447
+ | "Skill 明显很清楚" | 对你清楚 ≠ 对其他 agent 清楚。测试它。 |
448
+ | "只是个参考" | 参考可能有空白、不清楚的部分。测试检索。 |
449
+ | "测试太过了" | 未测试的 skill 总有问题。15 分钟测试省几小时。 |
450
+ | "出问题再测" | 出问题 = agent 用不了 skill。部署前测试。 |
451
+ | "测试太烦了" | 测试比在生产中调试坏 skill 不那么烦。 |
452
+ | "我有信心它没问题" | 过度自信保证出问题。还是测试。 |
453
+ | "学术审查就够了" | 读 ≠ 用。测试应用场景。 |
454
+ | "没时间测试" | 部署未测试的 skill 之后修复浪费更多时间。 |
455
+
456
+ **以上所有都意味着:部署前测试。没有例外。**
457
+
458
+ ## 让 Skill 抵抗合理化
459
+
460
+ 执行纪律的 skill(比如 TDD)需要抵抗合理化。Agent 很聪明,在压力下会找到漏洞。
461
+
462
+ **心理学注释:** 理解说服技术为什么有效有助于你系统地应用它们。参见 persuasion-principles.md 了解研究基础(Cialdini, 2021; Meincke et al., 2025),关于权威、承诺、稀缺性、社会证明和统一性原则。
463
+
464
+ ### 明确堵住每个漏洞
465
+
466
+ 不要只陈述规则,禁止具体的变通方法:
467
+
468
+ <Bad>
469
+ ```markdown
470
+ 先写了代码再写测试?删掉。
471
+ ```
472
+ </Bad>
473
+
474
+ <Good>
475
+ ```markdown
476
+ 先写了代码再写测试?删掉。从头来过。
477
+
478
+ **没有例外:**
479
+ - 不要把它留作"参考"
480
+ - 不要在写测试时"改编"它
481
+ - 不要看它
482
+ - 删除就是删除
483
+ ```
484
+ </Good>
485
+
486
+ ### 应对"精神 vs 字面"的论点
487
+
488
+ 在早期添加基础原则:
489
+
490
+ ```markdown
491
+ **违反规则的字面意思就是违反规则的精神。**
492
+ ```
493
+
494
+ 这切断了整类"我在遵循精神"的合理化借口。
495
+
496
+ ### 构建合理化表格
497
+
498
+ 从基线测试中捕获合理化借口(见下面的测试部分)。Agent 提出的每个借口都放进表格:
499
+
500
+ ```markdown
501
+ | 借口 | 现实 |
502
+ |------|------|
503
+ | "太简单不用测" | 简单代码也会出错。测试只要 30 秒。 |
504
+ | "我之后再测" | 立刻通过的测试什么都证明不了。 |
505
+ | "后写测试也能达到同样目的" | 后写测试 = "这做了什么?" 先写测试 = "这应该做什么?" |
506
+ ```
507
+
508
+ ### 创建危险信号列表
509
+
510
+ 让 agent 容易自查是否在合理化:
511
+
512
+ ```markdown
513
+ ## 危险信号 - 停下来,从头开始
514
+
515
+ - 先写了代码再写测试
516
+ - "我已经手动测过了"
517
+ - "后写测试也能达到同样目的"
518
+ - "重要的是精神不是仪式"
519
+ - "这次情况不一样因为..."
520
+
521
+ **以上所有都意味着:删掉代码。用 TDD 从头开始。**
522
+ ```
523
+
524
+ ### 更新 CSO 以包含违规症状
525
+
526
+ 在 description 中添加:你即将违反规则时的症状:
527
+
528
+ ```yaml
529
+ description: 实现任何功能或修复bug之前使用,在编写实现代码之前
530
+ ```
531
+
532
+ ## Skill 的红-绿-重构
533
+
534
+ 遵循 TDD 循环:
535
+
536
+ ### 红灯:写失败测试(基线)
537
+
538
+ 在没有 skill 的情况下用子 agent 运行压力场景。记录确切行为:
539
+ - 他们做了什么选择?
540
+ - 他们使用了什么合理化借口(原文)?
541
+ - 哪些压力触发了违规?
542
+
543
+ 这就是"看测试失败",你必须在写 skill 之前看到 agent 自然会做什么。
544
+
545
+ ### 绿灯:写最少的 Skill
546
+
547
+ 写 skill 针对那些具体的合理化借口。不要为假设的情况添加额外内容。
548
+
549
+ 用 skill 运行同样的场景。Agent 现在应该遵守了。
550
+
551
+ ### 重构:堵住漏洞
552
+
553
+ Agent 找到了新的合理化借口?添加明确的反驳。重新测试直到无懈可击。
554
+
555
+ **测试方法:** 参见 @testing-skills-with-subagents.md 了解完整的测试方法:
556
+ - 如何写压力场景
557
+ - 压力类型(时间、沉没成本、权威、疲劳)
558
+ - 系统地堵住漏洞
559
+ - 元测试技术
560
+
561
+ ## 反模式
562
+
563
+ ### ❌ 叙事示例
564
+ "在 2025-10-03 的会话中,我们发现空的 projectDir 导致了..."
565
+ **为什么不好:** 太具体,不可复用
566
+
567
+ ### ❌ 多语言稀释
568
+ example-js.js、example-py.py、example-go.go
569
+ **为什么不好:** 质量平庸,维护负担
570
+
571
+ ### ❌ 流程图中的代码
572
+ ```dot
573
+ step1 [label="import fs"];
574
+ step2 [label="read file"];
575
+ ```
576
+ **为什么不好:** 无法复制粘贴,难以阅读
577
+
578
+ ### ❌ 通用标签
579
+ helper1、helper2、step3、pattern4
580
+ **为什么不好:** 标签应该有语义含义
581
+
582
+ ## 停下来:在进入下一个 Skill 之前
583
+
584
+ **写完任何 skill 后,你必须停下来完成部署流程。**
585
+
586
+ **不要:**
587
+ - 批量创建多个 skill 而不逐个测试
588
+ - 在当前 skill 验证之前进入下一个
589
+ - 因为"批量更高效"就跳过测试
590
+
591
+ **下面的部署检查清单对每个 skill 都是必须的。**
592
+
593
+ 部署未测试的 skill = 部署未测试的代码。这违反了质量标准。
594
+
595
+ ## Skill 创建检查清单(TDD 适配版)
596
+
597
+ **重要:使用 TodoWrite 为下面每个检查项创建 todo。**
598
+
599
+ **红灯阶段 - 写失败测试:**
600
+ - [ ] 创建压力场景(纪律类 skill 需要 3 个以上组合压力)
601
+ - [ ] 在没有 skill 的情况下运行场景,逐字记录基线行为
602
+ - [ ] 识别合理化借口/失败中的模式
603
+
604
+ **绿灯阶段 - 写最少的 Skill:**
605
+ - [ ] 名称只使用字母、数字、连字符(不要括号/特殊字符)
606
+ - [ ] YAML frontmatter 只有 name 和 description(最多 1024 字符)
607
+ - [ ] Description 以"...时使用"开头,包含具体的触发器/症状
608
+ - [ ] Description 用第三人称写
609
+ - [ ] 全文包含搜索关键词(错误、症状、工具)
610
+ - [ ] 清晰的概述和核心原则
611
+ - [ ] 针对红灯阶段识别的具体基线失败
612
+ - [ ] 代码内联或链接到单独文件
613
+ - [ ] 一个优秀的示例(不要多语言)
614
+ - [ ] 用 skill 运行场景,验证 agent 现在遵守
615
+
616
+ **重构阶段 - 堵住漏洞:**
617
+ - [ ] 识别测试中的新合理化借口
618
+ - [ ] 添加明确的反驳(如果是纪律类 skill)
619
+ - [ ] 从所有测试迭代中构建合理化表格
620
+ - [ ] 创建危险信号列表
621
+ - [ ] 重新测试直到无懈可击
622
+
623
+ **质量检查:**
624
+ - [ ] 只在决策不明显时用小流程图
625
+ - [ ] 快速参考表格
626
+ - [ ] 常见错误章节
627
+ - [ ] 没有叙事故事
628
+ - [ ] 辅助文件只用于工具或大量参考
629
+
630
+ **部署:**
631
+ - [ ] 将 skill 提交到 git 并推送到你的 fork(如果已配置)
632
+ - [ ] 考虑通过 PR 贡献回去(如果广泛有用)
633
+
634
+ ## 发现工作流
635
+
636
+ 未来的 Claude 如何找到你的 skill:
637
+
638
+ 1. **遇到问题**("测试不稳定")
639
+ 3. **找到 SKILL**(description 匹配)
640
+ 4. **扫描概述**(这相关吗?)
641
+ 5. **阅读模式**(快速参考表格)
642
+ 6. **加载示例**(只在实现时)
643
+
644
+ **为这个流程优化** - 把可搜索的术语放在前面,经常出现。
645
+
646
+ ## 底线
647
+
648
+ **创建 skill 就是流程文档的 TDD。**
649
+
650
+ 同样的铁律:没有先写失败测试就不能写 skill。
651
+ 同样的循环:红灯(基线)→ 绿灯(写 skill)→ 重构(堵住漏洞)。
652
+ 同样的好处:更高质量,更少意外,无懈可击的结果。
653
+
654
+ 如果你对代码遵循 TDD,对 skill 也要遵循。这是同样的纪律应用到文档上。