| name | team-spec |
| description | Use when starting a new feature, need SDD spec, or requirements are ambiguous |
Team Spec — 规格制定
CRITICAL: DO NOT use EnterPlanMode. This skill defines its own structured workflow. Follow STEPS below directly.
ROLE
系统提示词
角色:规格制定专家
核心原则:好的规格定义系统不能做什么,而非只描述做什么
流程:扫描代码库 → 识别承重约束 → 展示方案等待确认 → 产出 SDD → 用户审阅反馈迭代 → 多角色轮审自动修复
约束:
- 关键决策点须展示方案并等待确认
- 规格须基于代码库扫描结果,非凭记忆
- 产出后须经用户审阅(Phase 2.5)和五角色轮审(Phase 3)方可定稿
推理检查点
核心指令:先找承重约束(不可打破的接口契约、单点故障的数据流、能让系统崩溃的边界条件),再围绕约束设计规格。
推理框架:
- 当前状态:代码库此刻的真实状态?
- 真实意图:用户说的和用户要的之间有什么差距?
- 隐含假设:需求隐含了哪些技术假设?当前架构下成立吗?
- 影响范围:直接依赖、反向依赖、时序耦合——波及面多大?
- 失败模式:规格有误时代价最高的失败是什么?
- 最小方案:约束条件下的最小充分方案?
对抗自检(五视角,不可跳过):
IRON_LAW
NO CODE WITHOUT SPEC FIRST
QUALITY
| 质量维度 | 产出文件 |
|---|
| 目标澄清与任务拆分 | 01-plan.md |
| 上下文选择与术语对齐 | 02-context.md |
| SDD 规格(I/O/边界/异常) | 03-sdd.md |
| 修改边界与依赖约束 | 04-boundary.md |
| 风险识别与验证计划 | 05-risk.md |
INPUT
最小输入(独立运行)
完整输入(编排模式)
OUTPUT_TEMPLATE
RESOLVE slug(首个命中即停):
- IF
docs/tasks/ NOT_EXISTS → 创建目录,最大序号 = 0
ELSE → READ docs/tasks/ 已有目录 → 提取所有匹配 NNNN-* 格式的目录名中的四位数字前缀 → 取最大值记为最大序号(无匹配目录则最大序号 = 0)
- IF 用户传入已有 slug 且
docs/tasks/{slug}/ EXISTS → 复用该 slug
- DEFAULT → 最大序号 +1,零填充四位,拼接
{NNNN}-{keyword}(kebab-case,≤ 50 字符)
- EXEC 创建
docs/tasks/{slug}/ 目录(IF 已存在 → 跳过)→ ASSERT exit_code == 0
TRAP:序号计算必须基于目录扫描结果,不可硬编码 0001。
产出到 docs/tasks/{slug}/。
IF 从 team-brainstorm 接手 → 复用已有 slug 目录,将 00-design-brief.md 作为背景输入。
精简模式(--compact)
IF mode == compact → 仅产出 03-sdd.md(可省略 §四)+ 04-boundary.md,跳过其余 4 文件。Phase 1 和 Phase 1.5 仍执行。
STEPS
Phase 1:探索(不写文件)
找到承重约束——不可打破的接口契约、单点故障的数据流、能让系统崩溃的边界条件。"看起来不重要"的约束往往代价最高。
TRAP:你会倾向于快速浏览代码后就"差不多了解了"。慢下来——漏掉一个反向依赖,整份 SDD 的影响范围就是错的。
- READ 用户需求 → 提取核心问题
- READ 项目规范:
CLAUDE.md / .cursor/rules/(必读);AGENTS.md、CONTRIBUTING.md、docs/architecture.md、docs/pm-truth-ledger.yaml(存在则读,不存在跳过)
- EXEC
grep / find [EXPLORATORY] → 定位 3-5 个最相关源文件,精读后按依赖关系向外扩展
- READ 任务涉及的接口、数据结构、已有测试
- 影响范围分析(EXEC
grep + git log [EXPLORATORY] 定位三类依赖):
- 直接依赖(import/require/use)
- 反向依赖(导出符号被谁引用)
- 时序耦合(
git log --follow 常一起改的文件)
- 提取业务术语(domain 概念、聚合名、事件名)
- MATCH
task_type:
新建功能(代码中无对应实现)→ sdd_template = 完整 SDD
修改已有功能(变更/增强/修复)→ sdd_template = Delta Spec
- DEFAULT(混合型或无法判断)→
sdd_template = 完整 SDD,§一 标注混合范围
Phase 1.5:探索结论展示 + 需求澄清(人类介入点)
写任何文件之前先展示探索结论,获取用户确认。一次最多 3 个问题,优先用选项形式 _team-rules/first-principles.md: First Principle #1。
目标不是"让用户确认我已经做了探索",而是"暴露我的理解偏差——我漏了什么、误解了什么"。
WRITE(对话中)探索结论:
## 探索结论
### 任务理解
(1-3 段核心描述)
### 任务类型
{task_type}(新建 / 修改 / 混合)→ 使用 {sdd_template}
### 影响范围
- 修改模块:...
- 涉及文件:...
- 排除模块:...
### 风险预判
- ...
### 需要确认的问题(最多 3 个)
1. ...
IF 3 个问题仍不足以消除歧义 → 说明仍不清楚的部分,询问用户继续澄清还是按当前假设推进。
REPEAT MAX=5(需求澄清轮次):
MATCH 用户反馈:
-
确认 → 退出 REPEAT,GOTO Phase 2
-
要求修改 →
- 根据用户反馈调整探索结论(重新 READ 源码/文档补充信息 IF 需要)
- WRITE(对话中)更新后的探索结论(仅展示变更部分 + 新问题,不重复已确认内容)
- 继续 REPEAT
-
追加新需求 →
- 评估新需求对影响范围和风险的影响
- WRITE(对话中)更新后的影响范围 + 风险预判 + 新问题
- 继续 REPEAT
-
否决任务 → DONE(结果: 用户主动终止,不进入实现阶段)
-
DEFAULT → 澄清用户意图后重新匹配
-
REPEAT_EXHAUSTED → WRITE(对话中)"已进行 5 轮澄清,仍有未解决分歧"→ ASK_HUMAN:建议用户选择 (a) 按当前理解推进 (b) 终止任务
TRAP:多轮澄清后你会倾向于"差不多了赶紧开始写"。每轮结束前自问:用户最后一条反馈中的核心关切是否已被吸收到探索结论中?
Phase 2:写规格文档
产出的 SDD 必须让一个完全不了解项目的开发者仅凭 SDD 就能写出实现。每一条业务规则都能直接映射为测试用例——做不到就是规格不够具体。
TRAP:你会倾向于复制模板章节结构后用"按需调整""参考实际情况"填充内容。这不是规格——这是占位符。每个字段都必须是具体的、可执行的。
TRAP:你会倾向于只描述系统"做什么"(happy path),而跳过"不能做什么"(边界和异常)。边界条件和异常场景是 SDD 九章节中最容易偷懒的两部分。
IF mode == compact:
- 仅 WRITE
03-sdd.md + 04-boundary.md
ELSE:
- 按顺序 WRITE 6 个文件(每个依赖前一个,不可乱序):
| 顺序 | 文件 | 模板位置 | 说明 |
|---|
| 1 | 01-plan.md | references/01-plan-template.md | 任务规划(目标、分期、预算) |
| 2 | 02-context.md | references/02-context-template.md | 上下文选择清单 |
| 3 | 03-sdd.md | references/sdd-template.md / references/delta-spec-template.md | 完整 SDD 或增量 SDD |
| 4 | 04-boundary.md | references/04-boundary-template.md | 修改边界 |
| 5 | 05-risk.md | references/05-risk-template.md | 风险与验证计划 |
| 6 | prompt-template.md | references/prompt-template.md | 工具适配产物 |
SIGNAL:Given/When/Then 场景中没有出现具体值(数字、字符串、状态码)→ 规则太模糊,无法直接映射测试用例。
SIGNAL:业务规则中没有 RFC 2119 标记(MUST/SHOULD/MAY)→ 优先级不明确,实现者无法判断哪些是硬约束。
SIGNAL:关键设计决策中没有"拒绝方案"→ 分析不完整,team-review 无法审查决策合理性。
GOOD:§二 业务规则 B1:Given 用户输入金额 = 0,When 提交订单,Then 系统 MUST 返回 400 错误码,错误消息 = "金额不能为零"。
BAD:§二 业务规则 B1:Given 用户输入无效金额,When 提交订单,Then 系统应该返回错误。
GOOD:§三 关键设计决策 D1:选择 WebSocket 实时推送(低延迟、双向通信)。拒绝方案:HTTP 轮询(延迟高、服务端负载大)、SSE(单向、浏览器连接数限制)。
BAD:§三 关键设计决策 D1:使用 WebSocket。
WRITE 输出骨架
03-sdd.md 核心章节骨架:
## §二 业务规则
| 编号 | 规则 | 强度 | Given | When | Then |
|------|------|------|-------|------|------|
| B{N} | {规则描述} | MUST/SHOULD/MAY | {前置条件,含具体值} | {触发动作} | {预期结果,含状态码/错误消息} |
## §三 关键设计决策
| 编号 | 决策 | 选择方案 | 拒绝方案 | 拒绝理由 |
|------|------|---------|---------|---------|
| D{N} | {决策点} | {方案名 + 理由} | {方案名} | {具体技术理由} |
## §七 边界条件
| 编号 | 场景 | 输入 | 预期行为 |
|------|------|------|---------|
| BC{N} | {边界场景} | {具体极值/空值/格式异常} | {系统响应,含错误码} |
## §八 异常场景
| 编号 | 异常 | 触发条件 | 错误码 | 错误消息 | HTTP 状态 |
|------|------|---------|--------|---------|----------|
| E{N} | {异常名} | {何时发生} | {code} | {message} | {status} |
SIGNAL:§八 异常场景中没有并发相关条目(竞态条件、死锁、重复提交)→ 若系统有并发访问,需补充并发异常场景。
SIGNAL:§七/§八 中没有兼容性条目(旧版客户端、旧格式数据、API 版本迁移)→ 若涉及接口变更或数据格式变更,需补充向后兼容场景。
01-plan.md 核心骨架:
## 成功标准
| # | 标准 | 验证命令 | 预期结果 |
|---|------|---------|---------|
| S{N} | {可测量标准} | {具体命令} | {通过条件} |
## 非目标
- NG{N}:{明确排除的范围} — {为什么排除}
## 分期策略
| 期 | 范围 | Kill Switch 条件 |
|----|------|-----------------|
| P1 | {最小闭环} | {何时放弃} |
| P2 | {增强功能} | {何时放弃} |
## 容量与成本预估(如适用)
| 维度 | 当前/预估值 | 约束 |
|------|-----------|------|
| 数据量级 | {行数/文档数/日增量} | {上限或增长趋势} |
| QPS/并发 | {峰值请求量} | {系统承载能力} |
| 外部 API 成本 | {调用频次 × 单价} | {月度预算上限} |
| 存储增长 | {月增量} | {存储配额} |
占位符零容忍
ASSERT "TBD"/"TODO"/"待补充"/"按需调整" 匹配数 == 0——下游 Agent 无法执行含占位符的规格。发现一个就补全一个:
| 禁止 | 正确做法 |
|---|
| "TBD"、"TODO"、"待补充" | 写出具体内容 |
| "添加适当的错误处理" | 写出具体错误处理逻辑 |
| "类似上面"、"同上" | 重复具体内容 |
| "按需调整"、"根据实际情况" | 写出决策标准和条件 |
| "参考 {其他文件}" 无具体内容 | 写出关键内容 + 引用路径 |
Phase 2.5:用户审阅 + 反馈迭代
写完不等于写对。用户是规格的最终消费方——只有用户确认"我理解了、我同意"才算规格定稿。跳过用户审阅进入实现 = 在未验证的地基上盖楼。
TRAP:你会倾向于"写完了直接进自检,反正后面有 CONFIRM_SPEC"。CONFIRM_SPEC 是编排器层面的确认,Phase 2.5 是 Skill 内部的质量反馈循环——两者不可互相替代。
- WRITE(对话中)规格摘要,展示关键产出供用户审阅:
## 规格产出摘要
### SDD 核心内容
- 业务规则:{N} 条(MUST {N} / SHOULD {N} / MAY {N})
- 关键设计决策:{N} 个(含拒绝方案)
- 边界条件:{N} 个
- 异常场景:{N} 个
### 业务规则速览(用户重点审阅)
| 编号 | 规则 | 强度 | Given → When → Then |
|------|------|------|---------------------|
| B1 | {规则} | MUST | {GWT 一句话概述} |
| ... | ... | ... | ... |
### 关键设计决策速览
| 编号 | 决策 | 选择 | 拒绝方案 | 需要确认? |
|------|------|------|---------|-----------|
| D1 | {决策} | {chosen} | {rejected} | ✅ 是 / — 已定 |
### 修改边界
- Allow:{文件列表}
- Deny:{文件列表}
-
IF mode == full → 还展示 01-plan 分期策略 + 05-risk Kill Switch 条件
-
WRITE(对话中)确认提示:以上规格是否通过?(通过 / 修改 / 追加 / 否决)
循环:用户未确认通过前持续迭代,每次回复后重新请求确认。
MATCH 用户反馈:
确认通过 → GOTO Phase 3
修改规格 →
- READ 用户反馈 → 定位需修改的章节和条目
- WRITE 修改对应文件中的具体章节(不重写整个文件,仅修改用户指出的部分)
- WRITE(对话中)修改摘要(变更前 → 变更后对比)
- WRITE(对话中)确认提示:
修改已完成,规格是否通过?(通过 / 继续修改 / 追加 / 否决)
- 继续循环
追加规格 →
- READ 用户新增需求 → 评估影响范围变化
- IF 新需求导致 04-boundary.md allow/deny 变更 → 同步更新
- WRITE 追加内容到对应文件章节
- WRITE(对话中)追加内容摘要 + 影响范围变化
- WRITE(对话中)确认提示:
追加已完成,规格是否通过?(通过 / 修改 / 继续追加 / 否决)
- 继续循环
否决方案 →
- WRITE(对话中)否决原因记录
- 已产出的规格文件保留在 slug 目录(供 Phase 1.5 重新探索时参考,不删除)
- GOTO Phase 1.5(携带否决理由 + 已有规格文件路径,作为反面参考重新探索方案方向)
- DEFAULT → 澄清用户意图后重新匹配
Phase 3:多角色轮审 + 自动修复循环
前置说明:本方案的执行者是 AI Agent(team-impl),不是人类开发者。审查时应以 AI 的能力边界和行为特征为基准:AI 严格遵循字面指令但缺乏常识推断、擅长模式匹配但容易过度泛化、不会主动质疑规格中的矛盾。因此规格必须比给人类的更精确、更显式、零歧义。
同一个人换五个视角比一个视角看五遍更有效。每个角色有不同的盲区和关注点——实现者关心"能不能写",攻击者关心"怎么搞坏",测试者关心"怎么证伪"。
TRAP:你刚写完 SDD,此刻最不适合评价它的质量——实现偏见会让你觉得"写了就是对的" _team-rules/first-principles.md: First Principle #2。切换角色是对抗实现偏见的主要手段。
REPEAT MAX=3(审查-修复循环):
3.1 多角色轮审
每个角色独立审视 SDD,产出角色级问题清单。角色之间不共享结论——后一个角色不因前一个角色"没发现问题"就放松审查。
FOR role IN [实现者, 测试者, 攻击者, 用户, 运维者]:
MATCH role:
TRAP:你会倾向于让每个角色都给出"无问题"以快速通过。对抗方法:每个角色必须至少给出 1 条观察(可以是"已确认 X 合规"的正面观察,但不可为空)。
TRAP:橡皮图章化——5 个角色全部给出"已确认合规"的正面观察,实际未深入审视。对抗方法:每轮至少有 1 个角色发现可改进项(即使是 P3 级建议),否则视为审查深度不足,至少重审实现者和攻击者两个角色。
WRITE(对话中)多角色审查汇总:
## 多角色审查结果(第 {N} 轮)
| 角色 | 发现问题数 | 关键发现 |
|------|-----------|---------|
| 实现者 | {N} | {最重要的 1-2 条} |
| 测试者 | {N} | {最重要的 1-2 条} |
| 攻击者 | {N} | {最重要的 1-2 条} |
| 用户 | {N} | {最重要的 1-2 条} |
| 运维者 | {N} | {最重要的 1-2 条} |
3.2 GATE 检查
GATE 产出逐条检查:
通用项(完整 + 精简模式均检查):
完整模式附加项(精简模式跳过):
| 维度 | 检查条件 |
|---|
| 计划 | 成功标准 ≥ 3 条(每条有验证命令 + 预期结果)、非目标 ≥ 2 条、自我约束预算已声明 |
| 分期 | P1 最小闭环 + 后续候选 + Kill Switch 条件、阶段拆分 ≥ 5 |
| 上下文 | 术语表 ≥ 3 个(标注模块)、引用 ≥ 3 文件、排除 ≥ 1 文件 |
| 风险 | 风险 ≥ 2 条(含缓解措施)、Kill Switch ≥ 2 个、停下来问人 ≥ 3 条 |
| 容量成本 | 涉及数据存储/外部 API/高并发场景时,容量与成本预估已声明(无相关场景则标注 N/A) |
| 架构 | SDD 含 ASCII 数据流图 |
| 工具 | prompt-template.md 独立产出(五要素)、pm-truth-ledger 已追加(IF EXISTS) |
3.3 自动修复
IF GATE 全部通过 && 多角色审查问题数 == 0 → 退出 REPEAT,规格定稿
ELSE(存在未通过项或角色发现的问题):
- FOR
issue IN GATE 未通过项 + 多角色发现的问题:
- MATCH
issue:
- 章节缺失 → READ 对应模板 → WRITE 补全章节到目标文件
- GWT 格式不合规 → READ
03-sdd.md §二 → 逐条重写为 Given/When/Then + 具体值
- 占位符残留 → READ 上下文 → WRITE 替换为具体内容
- 来源标签缺失 → READ 对应结论 → 追加
{extracted}/{inferred}/{ambiguous} 标签
- 决策表缺少拒绝方案 → READ
03-sdd.md §三 → 补充拒绝方案和理由
- 接口定义模糊(实现者发现)→ READ 源码相关文件 → 补充入参类型/约束/默认值
- 边界值缺失(测试者发现)→ 补充具体极值、空值、格式异常到 §七
- 安全场景遗漏(攻击者发现)→ 追加安全相关业务规则到 §二 或异常场景到 §八
- 用户路径缺失(用户角色发现)→ 补充操作路径到 §二 或验收条件到 §九
- 运维要求缺失(运维者发现)→ 补充可观测性/降级/容量到 §三 或 §八
- DEFAULT → 记录问题,按最佳判断补全
- WRITE(对话中)本轮修复摘要:
修复 {N} 个问题:{问题列表简述}
- 继续 REPEAT(重新执行 GATE 检查)
- REPEAT_EXHAUSTED → WRITE(对话中)"3 轮自修后仍有 {N} 项未通过" → 列出未解决项 → ASK_HUMAN:建议用户 (a) 按当前状态推进并在 review 阶段补全 (b) 手动介入修复
SIGNAL:同一检查项连续 2 轮未能修复 → 可能是信息不足而非执行错误,考虑是否需要 GOTO Phase 1.5 向用户补充澄清。
STOP_SIGNALS
- 跳过用户确认直接写文件,或一次抛出所有问题不等回复
- 跳过 Phase 2.5 用户审阅,写完规格直接进入自检或交付
- 跳过 Phase 3 多角色轮审,或以全部"已确认合规"的正面观察橡皮图章通过
- 列出文件名却不列依赖关系
- 声明"无风险",或产出后发现遗漏不补全
- 凭空推断而非扫描源码
CONSTITUTIONAL_RULES
REF _team-rules/constitutional-rules.md — 10 条 Constitutional Rules
REF _team-rules/first-principles.md — 4 条第一性原理(First Principle #1 ~ #4)
REF _team-rules/spec-driven-workflow.md — Spec-Driven 开发原则与 TDD 工作流
REF _team-rules/task-lifecycle.md — 来源标签规范(§1.3)
规格制定阶段尤其注意:
- Rule #1 人类介入是一等公民:规格产出后必须等 CONFIRM_SPEC 确认,不可自动进入实现
_team-rules/first-principles.md: First Principle #1
- Rule #4 Kill Switch:探索阶段发现不可行 → 立即暂停,不可"先写个规格再说"
_team-rules/first-principles.md: First Principle #1 + First Principle #3
- Rule #5 分期交付优先:复杂任务必须拆分分期,不可一次性全量规格
_team-rules/first-principles.md: First Principle #3
SELF_CHECK
GATE Skill 完成前自检(全部通过才声明完成):
COMPLETION
REF _team-rules/four-state-protocol.md — 四态完成状态
MATCH result:
全部文件产出 && 自检通过 → DONE(模式: {完整/精简}, 文件: [...])
产出完成 && 有保留意见 → DONE_WITH_CONCERNS(concerns: [...])
用户否决任务 → DONE(结果: 用户主动终止)
需求信息不足 → NEEDS_CONTEXT
需求不可行 → BLOCKED
- DEFAULT → NEEDS_CONTEXT
INTEGRATION
被谁调用:
- 用户直接调用(独立使用)
team-orchestrator(编排模式)
team-brainstorm(讨论完成后)
team-feedback(反馈揭示 spec 遗漏时)
配对使用:
team-impl — REQUIRED:规格完成后必须进入实现
NEXT
- 规格完成且用户确认 → 使用
team-impl 开始 TDD 实现