关于 Writing Skills
Writing Skills 指导如何把测试驱动开发应用于文档,创建可复用的 Agent 技能。它通过子 Agent 压力场景检验技能,并据此发现和弥补说明中的漏洞。
主要功能
- 01以测试驱动方式编写技能
- 02用子 Agent 设计压力场景
- 03技能类型与选择指南
- 04文档结构和发现优化
- 05测试与重构循环
适用场景
- 01将成熟方法整理成可复用技能
- 02检验 Agent 是否遵循文档规则
- 03发现技能说明中的缺口
- 04改善技能的可发现性与精简度
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ obra/ superpowers-skills --skill writing-skills安装后在 Claude Code 中输入/writing-skills确认已加载。
附带文件graphviz-conventions.dotpersuasion-principles.md
详细介绍
编写技能
概述
编写技能就是将测试驱动开发应用于流程文档。
技能编写在 ${SUPERPOWERS_SKILLS_ROOT} 中(克隆到 ~/.config/superpowers/skills/)。 你在此仓库的本地分支中编辑技能。
你先编写测试用例(使用子 Agent 进行压力场景测试),观察测试失败(基线行为),再编写技能(文档),观察测试通过(Agent 遵循要求),最后进行重构(堵住漏洞)。
核心原则: 如果你没有亲眼观察过 Agent 在没有技能的情况下失败,就无法确定技能教得是否正确。
参见 skills/testing/test-driven-development,了解基本的 RED-GREEN-REFACTOR 循环。此技能将 TDD 应用于文档。
什么是技能?
技能是关于经过验证的技术、模式或工具的参考指南。技能帮助未来的 Claude 实例找到并应用有效的方法。
技能包括: 可复用的技术、模式、工具和参考指南
技能不包括: 讲述你曾如何解决某个问题的故事
技能的 TDD 对应关系
| TDD 概念 | 技能创建 |
|---|---|
| 测试用例 | 使用子 Agent 的压力场景 |
| 生产代码 | 技能文档(SKILL.md) |
| 测试失败(RED) | Agent 在没有技能的情况下违反规则(基线) |
| 测试通过(GREEN) | 有技能时 Agent 遵循要求 |
| 重构 | 堵住漏洞,同时保持合规 |
| 先编写测试 | 编写技能之前运行基线场景 |
| 观察失败 | 记录 Agent 使用的确切理由 |
| 最少代码 | 编写技能,解决这些具体违规行为 |
| 观察通过 | 验证 Agent 现在会遵循要求 |
| 重构循环 | 找出新的理由 → 堵住漏洞 → 重新验证 |
整个技能创建过程都遵循 RED-GREEN-REFACTOR。
何时创建技能
适合创建的情况:
- 你直觉上并不清楚某项技术
- 你会在多个项目中再次参考它
- 该模式适用范围广(并非特定于某个项目)
- 其他人也会受益
不适合创建的情况:
- 一次性解决方案
- 其他地方已有充分文档说明的标准做法
- 项目特定的约定(放入 CLAUDE.md)
技能类型
技术
按步骤执行的具体方法(condition-based-waiting、root-cause-tracing)
模式
解决问题的思维方式(flatten-with-flags、test-invariants)
参考
API 文档、语法指南、工具文档(office docs)
目录结构
所有技能都位于 ${SUPERPOWERS_SKILLS_ROOT} 的技能仓库中:
${SUPERPOWERS_SKILLS_ROOT}
skill-name/
SKILL.md # Main reference (required)
supporting-file.* # Only if needed
扁平命名空间——所有技能都集中在一个可搜索的位置
单独存放以下内容:
- 大型参考资料(100 行以上)——API 文档、完整语法说明
- 可复用工具——脚本、实用程序、模板
保留在正文中:
- 原则和概念
- 代码模式(少于 50 行)
- 其他所有内容
SKILL.md 结构
---
name: Human-Readable Name
description: One-line summary of what this does
when_to_use: when [trigger/situation]
version: 5.1.0
languages: all | [typescript, python] | etc
dependencies: (optional) Required tools/libraries
---
# Skill Name
## Overview
What is this? Core principle in 1-2 sentences.
## When to Use
[Small inline flowchart IF decision non-obvious]
Bullet list with SYMPTOMS and use cases
When NOT to use
## Core Pattern (for techniques/patterns)
Before/after code comparison
## Quick Reference
Table or bullets for scanning common operations
## Implementation
Inline code for simple patterns
@link to file for heavy reference or reusable tools
## Common Mistakes
What goes wrong + fixes
## Real-World Impact (optional)
Concrete results
Claude 搜索优化(CSO)
发现技能至关重要: 未来的 Claude 需要找到你的技能
1. 丰富的 when_to_use
目的: Claude 会阅读 when_to_use,判断要为当前任务加载哪些技能。要让它能回答:“我现在应该阅读此技能吗?”
格式: 以 “when” 开头,使其能组成 “Use [skill-path] when [your text]”
内容:
- 使用具体的触发条件、症状和情境,表明此技能适用
- 描述问题(竞态条件、行为不一致),而不是特定于语言的症状(setTimeout、sleep)
- 除非技能本身特定于某项技术,否则触发条件应与技术无关
- 如果技能特定于某项技术,应在触发条件中明确说明
# ❌ BAD: Too abstract, doesn't start with "when"
when_to_use: For async testing
# ❌ BAD: Mentions technology but skill isn't specific to it
when_to_use: when tests use setTimeout/sleep and are flaky
# ✅ GOOD: Starts with "when", describes problem not language symptom
when_to_use: when tests have race conditions, timing dependencies, or pass/fail inconsistently
# ✅ GOOD: Technology-specific skill with explicit trigger
when_to_use: when using React Router and handling authentication redirects
find-skills 输出示例:
Use skills/testing/condition-based-waiting/SKILL.md when tests have race conditions, timing dependencies, or pass/fail inconsistently
2. 关键词覆盖
使用 Claude 可能会搜索的词语:
- 错误消息:“Hook timed out”、“ENOTEMPTY”、“race condition”
- 症状:“flaky”、“hanging”、“zombie”、“pollution”
- 同义词:“timeout/hang/freeze”、“cleanup/teardown/afterEach”
- 工具:实际命令、库名称、文件类型
3. 描述性命名
使用主动语态,以动词开头:
- ✅
creating-skills,而不是skill-creation - ✅
testing-skills-with-subagents,而不是subagent-skill-testing
4. 提高令牌效率(至关重要)
**问题:**入门工作流和频繁引用的技能会加载到每次对话中。每个令牌都很重要。
目标字数:
- 入门工作流:每篇少于 150 个单词
- 频繁加载的技能:总计少于 200 个单词
- 其他技能:少于 500 个单词(仍应简洁)
技巧:
将详细内容移至工具帮助:
# ❌ BAD: Document all flags in SKILL.md
search-conversations supports --text, --both, --after DATE, --before DATE, --limit N
# ✅ GOOD: Reference --help
search-conversations supports multiple modes and filters. Run --help for details.
使用交叉引用:
# ❌ BAD: Repeat workflow details
When searching, dispatch subagent with template...
[20 lines of repeated instructions]
# ✅ GOOD: Reference other skill
Always use subagents (50-100x context savings). See skills/using-skills for workflow.
精简示例:
# ❌ BAD: Verbose example (42 words)
your human partner: "How did we handle authentication errors in React Router before?"
You: I'll search past conversations for React Router authentication patterns.
[Dispatch subagent with search query: "React Router authentication error handling 401"]
# ✅ GOOD: Minimal example (20 words)
Partner: "How did we handle auth errors in React Router?"
You: Searching...
[Dispatch subagent → synthesis]
消除冗余:
- 不要重复交叉引用的技能中已有的内容
- 不要解释命令本身已显而易见的内容
- 不要为同一种模式提供多个示例
验证:
wc -w skills/path/SKILL.md
# getting-started workflows: aim for <150 each
# Other frequently-loaded: aim for <200 total
根据你要做的事或核心见解命名:
- ✅
condition-based-waiting>async-test-helpers - ✅
using-skills,而不是skill-usage - ✅
flatten-with-flags>data-structure-refactoring - ✅
root-cause-tracing>debugging-techniques
动名词(-ing)适用于描述流程:
creating-skills、testing-skills、debugging-with-logs- 以主动形式描述你正在采取的行动
4. 内容重复
多次提及关键概念:
- 在描述中
- 在 when_to_use 中
- 在概述中
- 在章节标题中
在多个位置都能通过 grep 找到,能让内容更容易被发现
5. 交叉引用其他技能
编写引用其他技能的文档时:
使用不带 @ 前缀或 /SKILL.md 后缀的路径格式:
- ✅ 推荐:
skills/testing/test-driven-development - ✅ 推荐:
skills/debugging/systematic-debugging - ❌ 不推荐:
@skills/testing/test-driven-development/SKILL.md(会强制加载,消耗上下文)
为什么不使用 @ 链接:@ 语法会立即强制加载文件,在你需要之前就消耗 200k+ 上下文。
**读取技能引用:**使用 Read 工具读取 ${SUPERPOWERS_SKILLS_ROOT}/category/skill-name/SKILL.md
流程图的使用
digraph when_flowchart {
"Need to show information?" [shape=diamond];
"Decision where I might go wrong?" [shape=diamond];
"Use markdown" [shape=box];
"Small inline flowchart" [shape=box];
"Need to show information?" -> "Decision where I might go wrong?" [label="yes"];
"Decision where I might go wrong?" -> "Small inline flowchart" [label="yes"];
"Decision where I might go wrong?" -> "Use markdown" [label="no"];
}
仅在以下情况使用流程图:
- 不明显的决策点
- 可能过早停止的流程循环
- 决定“何时使用 A 而非 B”
绝不要将流程图用于:
- 参考资料 → 表格、列表
- 代码示例 → Markdown 代码块
- 线性说明 → 编号列表
- 没有语义意义的标签(step1、helper2)
参阅 @graphviz-conventions.dot,了解 graphviz 样式规则。
代码示例
一个出色的示例胜过许多平庸的示例
选择最相关的语言:
- 测试技术 → TypeScript/JavaScript
- 系统调试 → Shell/Python
- 数据处理 → Python
优秀示例应当:
- 完整且可运行
- 注释清晰,解释原因
- 来源于真实场景
- 清楚展示模式
- 可直接改用(而非通用模板)
不要:
- 用 5 种或更多语言实现
- 创建填空式模板
- 编写牵强的示例
你很擅长移植代码,一个出色的示例就足够了。
文件组织
独立技能
defense-in-depth/
SKILL.md # Everything inline
适用情况:所有内容都能容纳其中,无需大量参考资料
带可复用工具的技能
condition-based-waiting/
SKILL.md # Overview + patterns
example.ts # Working helpers to adapt
适用情况:工具是可复用代码,而不只是叙述性内容
带大量参考资料的技能
pptx/
SKILL.md # Overview + workflows
pptxgenjs.md # 600 lines API reference
ooxml.md # 500 lines XML structure
scripts/ # Executable tools
适用情况:参考资料太多,不适合内嵌
铁律(与 TDD 相同)
NO SKILL WITHOUT A FAILING TEST FIRST
此规则适用于新技能以及对现有技能的编辑。
先写技能再测试?删除它,重新开始。 编辑技能却不测试?同样违反规则。
没有例外:
- 不适用于“简单的补充”
- 不适用于“只是添加一个章节”
- 不适用于“文档更新”
- 不要将未经测试的更改保留为“参考资料”
- 测试运行期间不要“顺便修改”
- 删除就是删除
参阅 skills/testing/test-driven-development,了解这为何重要。相同原则也适用于文档。
测试所有类型的技能
不同类型的技能需要不同的测试方法:
约束纪律的技能(规则/要求)
示例: TDD、完成前验证、先设计再编码
测试方法:
- 学术问题:他们是否理解规则?
- 压力场景:他们在压力下是否遵守规则?
- 多重压力叠加:时间 + 沉没成本 + 疲惫
- 找出合理化说辞,并添加明确的反驳
成功标准: Agent 在最大压力下仍遵守规则
技巧类技能(操作指南)
示例: 基于条件的等待、根因追踪、防御式编程
测试方法:
- 应用场景:他们能否正确应用技巧?
- 变化场景:他们能否妥善处理边界情况?
- 信息缺失测试:说明中是否存在漏洞?
成功标准: Agent 能在新场景中成功应用技巧
模式类技能(思维模型)
示例: 降低复杂度、信息隐藏概念
测试方法:
- 识别场景:他们能否识别何时适用该模式?
- 应用场景:他们能否运用该思维模型?
- 反例:他们是否知道何时不应应用?
成功标准: Agent 能正确判断何时以及如何应用模式
参考类技能(文档/API)
示例: API 文档、命令参考、库指南
测试方法:
- 检索场景:他们能否找到正确的信息?
- 应用场景:他们能否正确使用找到的信息?
- 覆盖缺口测试:是否涵盖了常见用例?
成功标准: Agent 能找到并正确应用参考信息
跳过测试的常见合理化说辞
| 借口 | 事实 |
|---|---|
| “技能显然写得很清楚” | 对你来说清楚 ≠ 对其他 Agent 来说清楚。要测试。 |
| “这只是参考资料” | 参考资料也可能存在漏洞或含糊不清的部分。要测试检索。 |
| “测试是小题大做” | 未测试的技能总会有问题。15 分钟的测试可以省下数小时。 |
| “出现问题时我再测试” | 出现问题 = Agent 无法使用技能。部署前就要测试。 |
| “测试太繁琐了” | 测试比在生产环境中调试有缺陷的技能轻松。 |
| “我确信它没问题” | 过度自信必然导致问题。无论如何都要测试。 |
| “只做学术审查就够了” | 阅读 ≠ 使用。要测试应用场景。 |
| “没时间测试” | 部署未经测试的技能,之后修复它会浪费更多时间。 |
以上所有说法都意味着:部署前先测试。没有例外。
防止技能被合理化说辞绕过
要求遵守纪律的技能(如 TDD)需要抵御合理化说辞。Agent 很聪明,在压力下会寻找漏洞。
心理学说明: 了解说服技巧为何有效,有助于你系统地运用它们。请参阅 persuasion-principles.md,了解有关权威、承诺、稀缺、社会认同和统一原则的研究基础(Cialdini,2021;Meincke 等人,2025)。
明确封堵每个漏洞
不要只陈述规则,还要禁止具体的变通做法:
```markdown Write code before test? Delete it. ``` ```markdown Write code before test? Delete it. Start over.No exceptions:
- Don't keep it as "reference"
- Don't "adapt" it while writing tests
- Don't look at it
- Delete means delete
</Good>
### 回应“重精神轻字面”的说法
尽早加入基本原则:
```markdown
**Violating the letter of the rules is violating the spirit of the rules.**
这样可以杜绝一大类“我遵循了精神”的合理化说辞。
制作合理化说辞表
记录基线测试中的合理化说辞(见下文的“测试”部分)。Agent 提出的每个借口都要列入表中:
| Excuse | Reality |
|--------|---------|
| "Too simple to test" | Simple code breaks. Test takes 30 seconds. |
| "I'll test after" | Tests passing immediately prove nothing. |
| "Tests after achieve same goals" | Tests-after = "what does this do?" Tests-first = "what should this do?" |
创建危险信号列表
方便 Agent 在进行合理化时自我检查:
## Red Flags - STOP and Start Over
- Code before test
- "I already manually tested it"
- "Tests after achieve the same purpose"
- "It's about spirit not ritual"
- "This is different because..."
**All of these mean: Delete code. Start over with TDD.**
在 CSO 中补充违规迹象
在 when_to_use 中加入你即将违反规则时的迹象:
when_to_use: when implementing any feature or bugfix, before writing implementation code
面向技能的 RED-GREEN-REFACTOR
遵循 TDD 循环:
RED:编写失败测试(基线)
在不提供技能的情况下,让子 Agent 执行压力场景。记录具体行为:
- 他们做出了哪些选择?
- 他们用了哪些合理化说辞(原话)?
- 哪些压力引发了违规?
这就是“观察测试失败”——编写技能前,必须先看看 Agent 自然会怎么做。
GREEN:编写精简技能
编写能解决这些特定合理化借口的技能。不要为假设情形添加额外内容。
使用技能再次运行相同场景。Agent 现在应该会遵从要求。
REFACTOR:堵住漏洞
Agent 找到了新的合理化借口?添加明确的反驳。重新测试,直到滴水不漏。
请参阅 skills/testing-skills-with-subagents,了解以下内容:
- 如何编写压力场景
- 压力类型(时间、沉没成本、权威、疲惫)
- 如何系统地堵住漏洞
- 元测试技术
反模式
❌ 叙事示例
“在 2025-10-03 的会话中,我们发现空的 projectDir 导致了……” **为什么不好:**过于具体,无法复用
❌ 多语言稀释
example-js.js、example-py.py、example-go.go **为什么不好:**质量平庸,维护负担重
❌ 流程图中的代码
step1 [label="import fs"];
step2 [label="read file"];
**为什么不好:**无法复制粘贴,难以阅读
❌ 通用标签
helper1、helper2、step3、pattern4 **为什么不好:**标签应具有语义
停止:开始下一个技能前
编写任何技能后,你都必须停止并完成部署流程。
不要:
- 未经测试就批量创建多个技能
- 当前技能尚未验证就转到下一个技能
- 因为“批量处理效率更高”而跳过测试
以下部署清单对每个技能都必须执行。
部署未经测试的技能,就等于部署未经测试的代码。这违反了质量标准。
技能创建清单(TDD 改编版)
重要:使用 TodoWrite 为以下每个清单项目创建待办事项。
RED 阶段——编写失败测试:
- 创建压力场景(纪律类技能需包含 3 种以上组合压力)
- 在不使用技能的情况下运行场景——逐字记录基线行为
- 找出合理化借口/失败中的模式
GREEN 阶段——编写精简技能:
- 名称应描述你要做什么或核心见解
- 编写包含丰富 when_to_use 内容的 YAML frontmatter(包括症状!)
- 贯穿全文添加搜索关键词(错误、症状、工具)
- 编写清晰的概述,说明核心原则
- 针对 RED 阶段发现的具体基线失败提供解决方案
- 将代码内联,或使用 @link 链接到单独文件
- 提供一个出色的示例(不要使用多种语言)
- 使用技能运行场景——验证 Agent 现在会遵从要求
REFACTOR 阶段——堵住漏洞:
- 找出测试中出现的新合理化借口
- 添加明确的反驳(如果是纪律类技能)
- 根据所有测试迭代构建合理化借口表
- 创建危险信号列表
- 重新测试,直到滴水不漏
质量检查:
- 仅在决策不明显时使用小型流程图
- 提供快速参考表
- 包含常见错误部分
- 不讲述叙事故事
- 仅在需要工具或大量参考资料时添加辅助文件
部署:
- 将技能提交到 git,并推送到你的 fork(如果已配置)
- 考虑通过 PR 回馈上游(如果对广泛用户都有用)
发现工作流
Claude 将来如何找到你的技能:
- 遇到问题(“测试不稳定”)
- 搜索技能——使用
find-skills工具(搜索技能仓库) - 找到 SKILL.md(丰富的 when_to_use 内容与需求相符)
- 浏览概述(这是否相关?)
- 阅读模式(快速参考表)
- 查看示例(仅在实施时)
针对这一流程进行优化——尽早且频繁地放置可搜索的词语。
核心要点
创建技能就是对流程文档应用 TDD。
同一条铁律:没有先编写失败测试,就不创建技能。 同一个周期:RED(基线)→ GREEN(编写技能)→ REFACTOR(堵住漏洞)。 同样的好处:质量更高、更少意外、结果滴水不漏。
如果你对代码遵循 TDD,也要对技能遵循 TDD。这是将同一种规范应用于文档。