with one click
spec-writing
需为非平凡功能/重构写设计文档(spec/design doc/RFC)时。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
需为非平凡功能/重构写设计文档(spec/design doc/RFC)时。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
需求模糊、含隐藏假设或 X-Y problem,需先澄清再动手时。
审查代码(自己的或别人的),需有重点、分层次地看时。
Git 改动需编写规范提交信息时。
遇到 bug、报错、崩溃或行为异常,需定位根因时。
设计或改进错误处理与日志时。
在 Lion-Skills 仓库创建或修改 skill 时。
| name | spec-writing |
| description | 需为非平凡功能/重构写设计文档(spec/design doc/RFC)时。 |
把一个还没动手的方案写成可评审、可追溯、可验收的设计文档。核心:spec 是决策的固化——它记录"为什么这么定、定了什么、没定什么、怎么算实现成功",而不是知识的搬运(堆背景介绍)或愿望的罗列(只说要做什么不说怎么做)。
不该用:小到一目了然的改动(直接做,写 spec 是负担);纯研究性命题还没结论时(先做 spike 调研,有了结论再写 spec——spec 记录决策,调研产出结论)。
与相邻 skill 的衔接:spec-writing 在"需求澄清 → 写 spec → 拆任务"流水线的中间。spec 定稿后,把方案交给 task-breakdown 拆成可执行任务;需求还太模糊连方案都形不成时,先澄清(见 clarifying-questions,未实现)再写 spec。
不是所有"写个 spec"的需求都该直接开写。如果方案的核心决策还依赖未澄清的未知,硬写出来的 spec 就是空架子或一堆猜测。先问自己:写 spec 需要的决策,我都有依据了吗?
判断标准——把"影响方案结构的关键决策"列出来,看每条是哪种状态:
如果大量关键决策都是"需要调研"状态,说明现在不是写 spec 的时机——先做调研。澄清和调研占 spec 前置工作的大头,跳过它们直接写,是最常见的失败模式。
判断后的产出顺序(很重要,别把几步混在一起让用户困惑):
澄清问题怎么问(这一步的产出质量直接决定 spec 质量):
task-breakdown 的"澄清未知"对此有更细的分类法,可参考。反例:用户说"写个限流 spec",你直接套模板写"背景/方案/步骤"——但"限流维度(接口/用户/IP)、算法(令牌桶/漏桶)、单机/分布式"都没定,写出来的方案部分全是占位符。
spec 的价值密度集中在决策上。每写一段问自己:**这是决策,还是背景知识?**两者的篇幅分配严重失衡是 spec 写差的信号:
反例:搜索功能 spec 一半篇幅在介绍 Elasticsearch 基于 Lucene、支持全文检索、生态丰富——这是知识搬运,不是决策。读者看完不知道你们为什么选它、什么场景选它、不选它会怎样。
研究基础怎么写:调研/spike 的结论要进 spec,但只写"对决策有用的结论",不写调研过程。差的做法是堆"我查了 A、B、C,A 是……B 是……"的流水账;好的做法是直接给"对比结论 + 选定理由",如"对比 Redis 滑动窗口与 Sentinel 网关限流:Redis 方案在多实例下计数精确(误差<1%)、Sentinel 依赖单网关成瓶颈,选 Redis"。读者要的是结论支撑决策,不是重新跟你调研一遍。
spec 里一定有没定死的东西(技术选型还在权衡、依赖外部团队、待 spike 结论)。显式标出来,不要把它们包装成"已定方案"蒙混过关。藏起来的不确定性会在实现期爆炸——下游按"已定"去做,结果方案根本没敲定,返工。
标注方式:
TBD:xxx,待 yyy 后定。例:分布式事务方案 TBD,待 Saga 与最终一致性的压测对比后定。消息队列:Kafka(吞吐高、运维重)vs RabbitMQ(够用、轻量),倾向 RabbitMQ,待容量评估确认。显式 TBD 让评审者一眼看到"哪里还没定",也能让 spec 在未决状态下流转(不必等所有事都想清才能写)。
明确"本轮做什么"的同时,显式列出"不做什么"。范围不清是 spec 失败的高频原因——什么都往里塞,最后要么无限膨胀做不完,要么做出来的和初衷不符。
"不做什么"包含两类:
spec 不止写"做什么",还要写"做完怎么算成功"——可验证的验收标准。否则实现完了没法判断达标与否,"是否完成"变成主观感受。
好的验收标准是可观测、可量化的:
验收标准同时是 spec 范围的反向校验——如果你写不出验收标准,说明"做什么"本身还没定义清楚,回去补范围。
对高风险方案(迁移、架构重构、数据变更、破坏性改动),spec 必须有"风险与回滚"维度。这类方案最怕的不是"怎么做",而是"做错了怎么办":
低风险的小改动不必硬塞这个维度,过度防御也是 spec 的负担。
用户拿一份已有草稿让你"看看",先判断它属于哪种问题,处理方式完全不同:
审查意见要排优先级,别一次甩十几条。按"致命 → 重要 → 锦上添花"分:致命的是会导致返工或方向错的(藏了不确定性、范围不清、没验收);重要的是影响可读性的(堆背景);锦上添花的是措辞结构。先改致命的——一份 spec 修好最致命的 1-2 条,价值远大于把 10 条小毛病都列出来。一次列太多,用户接不住、反而无从下手。
审查用具体定位而非泛泛批评:指出"第 X 段是背景科普,应压成一句决策依据",而不是"写得不够详细"。
最终交给用户的是精简、结构化的内容,不是论证长文:
TBD:xxx,候选 A(代价)/B(代价),倾向 X,待 Y),别展开成多段。记住:spec 的读者是评审者和未来的实现者,他们要快速判断"这方案对不对、怎么做",不是欣赏你分析得多彻底。
按需取用,不必每节都有——以"能讲清决策"为准:
# <标题>
## 元信息 <日期、状态(草稿/评审中/已定)、范围>
## 背景与目标 <问题是什么、为什么做、目标是什么;背景点到够用>
## 研究基础 <决策依据:调研结论、对标、数据;不是科普>
## 范围 <做什么 + 明确不做什么>
## 设计 <核心决策:选了什么、为什么、放弃什么;未决项标 TBD>
## 风险与回滚 <高风险方案必备;低风险可省>
## 验收标准 <怎样算实现成功:可观测、可量化>
## 后续 <下一步动作、依赖、待定项的解决计划>
| 问题 | 修法 |
|---|---|
| 核心决策未知未澄清就硬写 spec | 先判断决策状态,需澄清先问、需调研先做 spike |
| 堆背景知识,决策却一带而过 | 压缩背景到"决策够用",篇幅让给"为什么这么定" |
| 把未决项写成已定方案 | 显式标 TBD + 列选项权衡,别藏不确定性 |
| 范围只有"做什么"没有"不做什么" | 显式列排除项,防范围蔓延 |
| 没有"做完算成功"的标准 | 写可观测、可量化的验收标准 |
| 高风险方案没写风险与回滚 | 迁移/重构/破坏性改动必加风险与回滚维度 |
| 小改动也套完整模板硬撑篇幅 | 按需取节,能讲清决策即可,不为全而全 |
| 信息不足型草稿直接打补丁 | 退回前置流程:列澄清问题 + spike,别在残缺上修 |
| 审查意见一次列十几条不排优先级 | 按"致命/重要/锦上添花"分,先改最致命的 1-2 条 |