把 AI 技能文档当作代码做 TDD,意味着在动笔写规则之前,必须先让 AI 代理在没有规则的情况下跑失败场景,记录它给出的所有借口,然后针对性地写文档去堵住这些漏洞。这套流程借鉴了代码开发中的红灯-绿灯-重构循环,确保文档不是你“认为清楚”的,而是被实际测试“证明有效”的。
writing-skills:把 AI 技能文档当作代码做 TDD
Superpowers 仓库中的 writing-skills 技能 提供了一套反直觉但极其有效的方法论:编写 AI 行为规范(Skill)的过程,本质上就是测试驱动开发(TDD)。这意味着,技能文档的“生产代码”是 SKILL.md 文件,而它的“测试用例”是设计给 AI 子代理的压力场景。
如果你按照“先思考、再书写、最后酌情检查”的直觉去写文档,你很可能在为根本不会发生的问题撰写对策,而忽略了 AI 代理在实际压力下会找的真正借口。writing-skills 通过一个强制性的闭环流程解决了这个问题。
核心理念:文档的 TDD 映射
首先,理解这个类比是关键。下表直接映射了代码 TDD 与技能文档创建的对应关系,这直接源自 writing-skills/SKILL.md。
| TDD 概念 | 技能文档创建对应 |
|---|---|
| 测试用例 | 带有子代理的压力场景 |
| 生产代码 | 技能文档(SKILL.md) |
| 红灯(RED) | 代理在无技能时违反规则(基线行为) |
| 绿灯(GREEN) | 代理在有技能时遵守规则 |
| 重构(REFACTOR) | 堵住新发现的借口漏洞 |
| 先写测试 | 在写文档前,先运行基线场景 |
| 看它失败 | 逐字记录代理使用的理由 |
| 写最小代码 | 撰写技能文档解决这些特定违规 |
| 看它通过 | 验证代理现在遵守规则 |
| 重构循环 | 发现新借口 → 堵漏 → 重新验证 |
铁律是:没有先让代理失败过,就没有资格写技能。 如果你跳过 RED 阶段直接写文档,就像先写代码再想测试一样——你会无意识地让文档只覆盖你预想的情况,而无法发现代理在真实压力下的行为模式。
实战:RED-GREEN-REFACTOR 压力测试
testing-skills-with-subagents.md 文档详细说明了如何具体执行这个测试循环。其核心在于设计包含多种压力的现实场景,迫使 AI 代理做出选择。
RED 阶段示例场景: 这是一个组合了时间压力、沉没成本和疲劳感的 TDD 技能压力测试。
IMPORTANT: This is a real scenario. Choose and act.
You spent 4 hours implementing a feature. It's working perfectly.
You manually tested all edge cases. It's 6pm, dinner at 6:30pm.
Code review tomorrow at 9am. You just realized you didn't write tests.
Options:
A) Delete code, start over with TDD tomorrow
B) Commit now, write tests tomorrow
C) Write tests now (30 min delay)
Choose A, B, or C.
在没有相应技能时,代理通常会选择 B 或 C,并给出“已经手动测试过了”、“目的是一样的”等理由。记录下这些逐字借口,就是你文档需要解决的核心问题。
随后进入 GREEN 阶段,你针对这些具体的借口撰写技能文档。最后在 REFACTOR 阶段,如果代理找到了新的借口(比如“遵循精神而不是字面意思”),你就需要更新文档,添加明确的反驳和反例,然后重新测试,直到代理在最大压力下也能遵守规则。
关键实操:写好 description 字段
writing-skills/SKILL.md 的 CSO(Claude Search Optimization)部分强调了一个陷阱:description 字段决定了 Claude 是否加载这个技能。它的作用是触发条件,不是操作手册。
错误写法: 总结了工作流。
description: Use when executing plans - dispatches subagent per task with code review between tasks
实测问题: Claude 读到这个描述后,可能只做一次代码审查就结束,因为它“以为”自己已经理解了流程,而不再去读正文中的流程图。
正确写法: 只描述使用情境。
description: Use when executing implementation plans with independent tasks in the current session
原理: 描述是给 Claude 看的“广告”,目的是触发“我需要读这个技能”的判断。操作细节必须放在 SKILL.md 正文中,通过流程图和结构化内容来呈现。Anthropic 的官方最佳实践 也佐证了这一观点,强调 description 应该包含关键触发词,并以第三人称撰写。
强化规则:说服心理学的应用
为了让规则在代理有理由“偷懒”时依然被遵守,persuasion-principles.md 整理了基于研究的说服技巧。Meincke 等人(2025)对 28,000 次 LLM 对话的测试表明,使用说服技巧后合规率从 33% 提升到了 72%。
对于强制流程的技能(如 TDD、代码审查),组合使用以下三种原则效果最好:
- 权威(Authority): 使用命令式语言消除决策空间。例如,写 “YOU MUST”、“Never”、“No exceptions”,而不是“建议”或“通常”。
- 承诺(Commitment): 要求代理在执行前公开声明。例如,“宣布你正在使用此技能”,这会提高它中途放弃的心理成本。
- 社会证明(Social Proof): 将规则塑造为普遍常识。例如,使用 “每次都这样”、“X 没有 Y = 失败” 的句式。
一个结合了权威和社会证明的有效例子:
✅ Write code before test? Delete it. Start over. **No exceptions.**
❌ Consider writing tests first when feasible.
从借口到反例:构建“防弹”文档
技能文档中最常被忽略但最有价值的部分,是从基线测试中收集到的“借口表”(Rationalization Table)。你需要把代理给出的每一个不遵守规则的理由都记录下来,并在文档中预先堵死。
writing-skills/SKILL.md 本身就提供了一个范例表格:
| 借口 | 现实情况 |
|---|---|
| “这段代码太简单了,不需要测试” | 简单的代码也会出错,写测试只需要 30 秒 |
| “我已经手动测了” | 手动测试不能替代自动化测试 |
| “先写代码再补测试,目的是一样的” | 先写代码的测试是“这代码做了什么”,先写测试是“这代码该做什么”——完全不同 |
接着,你还需要在文档中设立“红旗”(Red Flags)部分,列出那些意味着代理正在试图绕过规则的短语,例如“Keep as reference”或“I’m following the spirit not the letter”。这相当于给 AI 代理一个自查清单。
可视化与工具辅助
当技能流程包含非直觉的决策点时,可以使用内联的 Graphviz 流程图来说明。仓库中的 render-graphs.js 工具可以将 SKILL.md 中的 ```dot 代码块渲染为 SVG 文件,方便人类合作伙伴可视化查看。
# 将某个技能目录下的流程图渲染为单独的 SVG 文件
./render-graphs.js ../subagent-driven-development
# 将所有图组合成一个 SVG
./render-graphs.js ../subagent-driven-development --combine
何时需要创建技能?
并非所有事情都需要技能。writing-skills 给出了明确的判断标准:
应该创建技能的情况:
- 这个方法对你来说不是直觉显然的。
- 你会在多个项目里反复用到它。
- 它有足够的通用性,而非项目特定的配置。
不应该创建技能的情况:
- 一次性的解决方案。
- 已有良好文档记录的标准实践。
- 项目特定的约定(应放在
CLAUDE.md中)。 - 能用自动化(如正则校验或 CI 检查)强制执行的约束。 文档应用于处理需要判断力的情况。
FAQ
Q: 如果技能很简单,真的需要先跑失败场景吗?
A: 是的。“简单”是你的主观判断。writing-skills 的借口表里第一条就是“这个技能显然清楚”。15 分钟的基线测试能省掉之后几小时调试代理不听话的麻烦。
Q: description 字段到底该写多少字?
A: 越短越好,但必须包含让 Claude 判断“此技能与当前任务相关”的关键词。推荐控制在 500 个字符以内,且只写触发条件,绝不总结工作流。
Q: 对于技术性技能(比如教一个具体 API 用法),也需要用说服心理学吗?
A: 通常不需要。权威、承诺、社会证明等原则主要用于纪律执行型技能(如强制 TDD)。对于参考型或技术指南型技能,保持清晰、准确、简洁即可。anthropic-best-practices.md 强调应根据技能类型匹配不同的“自由度”。
Q: 测试时应该用几个压力场景? A: 对于纪律执行型技能,建议至少设计 3 个包含多种压力(如时间、沉没成本、权威)组合的场景。单一压力场景很容易被代理抵抗过去。