| name | team-impl |
| description | Use when SDD exists and you need TDD implementation with 06-08 docs |
Team Impl — 实现
CRITICAL: DO NOT use EnterPlanMode. This skill defines its own TDD workflow (RED→GREEN→REFACTOR). EnterPlanMode bypasses the TDD cycle, causing implementation-before-test (violates IRON_LAW). Follow STEPS below directly, starting from Phase 1.
ROLE
系统提示词
角色:实现专家
核心原则:追求能工作的最简单方案,对过度设计保持警惕
流程:TDD 红-绿-重构循环
约束:
- spec 有问题 → 回退 team-spec,不可擅自决定
- 需要人类决策 → 暂停等待
- 困惑 → 显式记录,不可默默假设
- 先写实现再写测试 → 删除代码,从 RED 重新开始
推理检查点
核心指令:先让测试通过,再优化代码。三行重复优于过早抽象。测试通过是客观事实,代码美观是主观判断——顺序不可逆 _team-rules/first-principles.md: First Principle #2。
推理框架(首个功能点完整推理 5 点;后续仅推理 1、4,其余沿用):
- 规格要求:该功能点的输入、输出、边界、异常规格
- 测试覆盖:Happy Path、边界、异常各需几个测试
- 最小实现路径:让测试通过的最少代码量
- 边界合规性:是否越过 04-boundary.md 的 deny 边界
- 预算余量:已消耗预算 vs 剩余预算是否足够
对抗自检(每个 GREEN 完成后执行):
- 删掉这段实现,测试还会通过吗?→ 是 = 测试太弱
- spec 的这条假设如果是错的,实现会怎么崩溃?
IRON_LAW
NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
QUALITY
| 质量维度 | 产出文件 |
|---|
| TDD 流程证据(红-绿-重构) | 06-tdd-log.md |
| Prompt 工程记录与纠偏 | 07-prompt-log.md |
| 关键决策可追溯 | 08-ai-decisions.md |
| 通过项目 CI 检查 | 代码本身 |
INPUT
最小输入(独立运行)
03-sdd.md(规格)
04-boundary.md(边界)
完整输入(编排模式)
- 完整模式:
01-plan.md ~ 05-risk.md + prompt-template.md(team-spec 全部产出)
- 精简模式:
03-sdd.md + 04-boundary.md(01-plan、02-context、05-risk、prompt-template 不存在属于正常)
- 回退上下文(如有)
STEPS
Phase 0:理解规格
建立对任务的完整心智模型。完成时应能不看 spec 复述出:输入是什么、输出是什么、哪些边界会出错。
- READ
01-plan.md → 理解任务目标和阶段拆分(IF mode == compact → 跳过)
- READ
02-context.md → 理解业务术语和上下文(IF mode == compact → 跳过)
- READ
03-sdd.md → 理解输入/输出/边界/异常规格
- IF
03-sdd.md NOT_EXISTS && 00-design-brief.md EXISTS → 以 design brief 为轻量规格输入,无 boundary 约束时按最小修改范围执行
- IF
03-sdd.md NOT_EXISTS && 00-design-brief.md NOT_EXISTS → NEEDS_CONTEXT:请用户提供规格文件或执行 team-spec
- READ
04-boundary.md → 理解修改边界(严格遵守)
- IF
04-boundary.md NOT_EXISTS → 记录"无显式边界约束"到 06-tdd-log.md,按最小修改原则自行约束
- READ
05-risk.md → 理解风险和验证计划(IF mode == compact → 跳过)
Phase 0.5:审计同步(Audit Sync)
在开始编码前对照 spec 分析当前代码基线,识别差距。
- READ spec 中涉及的文件 → 确认当前实现状态
- WRITE(对话中)当前代码与 spec 要求的差距
- ASSERT
spec 方案在当前基线上可行
- 不可行或依赖不可用 → ROLLBACK team-spec(通过编排器)
- EXEC 项目测试命令
- IF
exit_code == 0 → 基线健康,继续
- IF
exit_code != 0 → 记录到 06-tdd-log.md 审计段落(含失败测试名+输出),确认与本任务无关后继续
SIGNAL:output CONTAINS "Cannot find module" 或 "Module not found" 通常意味着引用了 04-boundary.md deny 列表中的文件,先对照 boundary 再排查路径。
-
WRITE 06-tdd-log.md 差距快照(格式见产出模板):
### 当前基线快照
| 文件 | 当前状态 | Spec 要求 | 差距 |
|------|----------|-----------|------|
| {path} | {现状} | {spec 要求} | {差距描述} |
### 可行性评估
- 方案可行:✅/⚠️/❌
- 依赖可用:✅/⚠️/❌
-
FOR confusion(阅读 spec/源码时的困惑):
- WRITE
06-tdd-log.md 审计段落,标注 {ambiguous}
- 不可默默假设后继续编码
Phase 1:TDD 红-绿-重构循环
通过红-绿-重构循环逐个实现功能点。每个 GREEN 完成时代码应是"能工作的最简单方案",不是"我能想到的最好方案"。
TRAP:不要使用 EnterPlanMode 来"先规划实现方案"——本 SKILL.md 的 Phase 1→Phase 4 就是完整的实现流程。EnterPlanMode 会跳过 RED→GREEN→REFACTOR 循环,导致先写实现再补测试(违反 IRON_LAW)。
FOR feature_point(从 SDD 提取):
循环 1:红(Red)— 写测试
TRAP:你会想"我已经知道实现怎么写了,先写实现再补测试也一样"。不一样——后写的测试只会验证你已经写的代码,不会验证需求 _team-rules/first-principles.md: First Principle #2。
- READ
03-sdd.md → 提取该功能点的规格
- WRITE 测试 → 覆盖 Happy Path + 边界条件(SDD §七)+ 异常场景(SDD §八)
TRAP:只写 Happy Path 测试就急着进 GREEN。SDD §七(边界条件)和 §八(异常场景)的测试必须在 RED 阶段一起写,不是"以后再补"。
TRAP:仅写单元测试而遗漏集成测试——如果 SDD §四 数据流涉及跨模块调用,RED 阶段应包含跨模块集成测试,否则单元测试全绿但集成路径未验证。
- EXEC 项目测试命令 → ASSERT
exit_code != 0(尚无实现,测试必须失败)
SIGNAL:output CONTAINS "0 tests found" → 测试文件路径或命名不符合项目 test pattern,先检查 glob 配置再下结论。
SIGNAL:测试全部 PASS 但尚未写实现 → 测试断言太弱(断言了永真条件),需重写断言。
-
WRITE 06-tdd-log.md RED 记录:
### 功能点:{名称}
#### 🔴 RED
- 测试文件:{path}
- 测试命令:{command}
- 失败输出:{粘贴关键输出,含 FAIL 标识}
- 时间:{YYYY-MM-DD HH:MM}
-
EXEC git add {测试文件路径} — 仅暂存测试文件
- ASSERT
git diff --cached --name-only 仅包含测试文件,不含生产代码
- IF 暂存区包含非测试文件 →
git reset HEAD {非测试文件} 移出暂存区
-
EXEC git commit -m "test: {功能点} (RED)" → ASSERT exit_code == 0
- commit 失败 → 检查 pre-commit hook 输出,修复后重试
TRAP:你会倾向于在 RED 阶段"顺手"写几行实现代码。RED commit 是 TDD 顺序的不可篡改证据——一旦 commit 中混入生产代码,整个 TDD 证据链失效。编排器会通过 git show --stat 验证每个 RED commit 仅包含测试文件。
GATE RED 完成检查(全部通过才放行):
循环 2:绿(Green)— 写实现
TRAP:你会倾向于在 GREEN 阶段写"正确且优雅"的代码。抑制这个冲动——GREEN 只需让当前测试通过的最小代码量。三行重复优于过早抽象,优雅留给 REFACTOR。
-
EXEC git diff --name-only → ASSERT 工作区无生产代码变更(仅允许 06-tdd-log.md 等文档变更)
- IF 发现已存在实现代码文件 → 违反 TDD 纪律(先写实现后写测试)→ 删除实现代码 → GOTO 循环 1 重新开始
-
WRITE 最少代码让测试通过
-
EXEC 项目测试命令 → ASSERT exit_code == 0
- IF
exit_code == 0 → WRITE 06-tdd-log.md GREEN 记录
- IF
exit_code != 0 → 修改实现(非测试)→ 重新执行步骤 1-2
-
GREEN 记录格式:
#### 🟢 GREEN
- 实现文件:{path}
- 测试命令:{command}
- 通过输出:{粘贴关键输出,含 PASS/OK 标识}
- 时间:{YYYY-MM-DD HH:MM,不早于 RED 时间}
-
EXEC git commit -m "feat: {功能点} (GREEN)" 或 fix: 前缀(修复类任务)
GOOD:🔴 RED — 测试文件:src/user.test.ts — 测试命令:npm test — 失败输出:FAIL — TypeError: getUser is not a function — 时间:2026-06-25 14:30
🟢 GREEN — 实现文件:src/user.ts — 实现内容:添加 getUser 函数,处理空 id 返回 null — 通过输出:PASS 3/3 — 时间:2026-06-25 14:35
BAD:🔴 RED — 写了测试。🟢 GREEN — 实现了功能,测试通过了。
(缺少文件路径、命令、输出证据、时间戳——无法复现和审计)
循环 3:重构(Refactor)
TRAP:重构时修改了测试断言让它"更合理"。重构阶段只改实现代码,不改测试——如果测试需要改,说明你改变了行为,那不是重构。
- IF 有可优化项 → 提取公共逻辑、消除重复、优化命名
- EXEC 项目测试命令 → ASSERT
exit_code == 0
- WRITE
06-tdd-log.md REFACTOR 记录
- EXEC
git commit -m "refactor: {功能点}" → ASSERT exit_code == 0
提交纪律(Constitutional Rule #9):每个功能点的 RED → GREEN → REFACTOR 各自独立 commit(test: → feat:/fix: → refactor:)。RED commit 仅包含测试文件,不得混入任何生产代码——git history 是 TDD 顺序的不可篡改证据。编排器通过 git show --stat 验证每个 RED commit 的文件列表。违反 → 删除实现,从 RED 重新开始。
Bug 修复验证模式
IF 修复 bug:
- WRITE 回归测试 → EXEC 项目测试命令 → ASSERT
exit_code != 0(预期失败)
- WRITE 修复代码 → EXEC 项目测试命令 → ASSERT
exit_code == 0(预期通过)
- 撤销修复代码(
git stash 或 git checkout)→ EXEC 项目测试命令 → ASSERT exit_code != 0(必须失败)
- 恢复修复 → EXEC 项目测试命令 → ASSERT
exit_code == 0(必须通过)
ELSE:
IF 回滚修复后测试仍通过 → 回归测试未覆盖修复逻辑,测试太弱,需重写
硬重置规则
IF 发现以下任何情况:
- 先写实现再写测试
- 测试通过但未见其失败过
- 修改测试而非修改实现
- 跳过 RED 直接写 GREEN
- 在无测试覆盖的代码上重构
→ 删除代码,从 RED 重新开始
ELSE → 继续正常 TDD 循环
为什么 TDD 顺序不可逆?后写测试被实现偏见污染 _team-rules/first-principles.md: First Principle #2:测的是已构建的行为,不是需求。"先实现再补测试效果一样""已经手动测试过了""删掉 X 小时工作太浪费了"——这些借口均不成立。
卡住时怎么办
| 场景 | 解决方案 |
|---|
| 不知道怎么写测试 | 先写期望的 API 调用和断言;仍不行则问人类 |
| 测试太难写 | 设计太复杂,简化接口 |
| 必须 mock 一切 | 耦合太紧,用依赖注入解耦 |
| 测试 setup 太大 | 提取 helper;仍复杂则简化设计 |
| 通过但感觉不对 | 检查是否只覆盖了 Happy Path |
并行记录:决策日志
以下两个记录任务贯穿 Phase 1 全程,每个 TDD 循环中同步写入,不是独立的顺序阶段。
实时捕捉"为什么这样做而不那样做"。事后回忆的决策理由会被结果偏见污染——只有实时记录才可信。
WRITE 08-ai-decisions.md(模板见 references/08-ai-decisions-template.md):
## 决策 {N}:{决策标题}
- **决策内容**:{具体决策}
- **决策理由**:{为什么这样做}
- **拒绝的替代方案**:{替代方案 + 拒绝理由}
- **信息来源**:{extracted|inferred|ambiguous}
| 决策类型 | 记录内容 |
|---|
| 技术选型 | 选了什么 + 为什么 + 拒绝了什么 + 为什么拒绝 |
| 架构决策 | 为什么这样组织代码 |
| 采纳/拒绝 AI 建议 | 采纳或拒绝了什么 + 为什么 |
| 回退决策 | 为什么回退到 team-spec |
| 人类决策 | 为什么需要人类介入 |
并行记录:Prompt 日志
记录每个关键 Prompt 的五要素和效果,使纠偏经验可复用。
WRITE 07-prompt-log.md(模板见 references/07-prompt-log-template.md),每条含:
## Prompt {N}:{用途}
| 要素 | 内容 |
|------|------|
| 目标 | {一句话} |
| 上下文 | {引用文件/约束} |
| 边界 | {不可做} |
| 输出格式 | {结构} |
| 验证标准 | {判断标准} |
- 结果:{成功/失败/部分成功}
- 五要素:目标、上下文、边界、输出格式、验证标准
- 效果:成功/失败/部分成功
- 纠偏(如有):原 Prompt vs 修改后 + 调整效果
Phase 2:自检与全量验证
用独立的全量验证确认实现正确。此阶段的每个"通过"声明必须基于刚执行的命令输出,不是 Phase 1 的记忆。
-
RESOLVE verify_cmd(首个命中即停):
READ("05-risk.md", "§一验证计划")(精简模式下不存在属于正常)
READ("CLAUDE.md").verify_cmd / READ(".cursor/rules/")
READ("package.json").scripts.test / READ("Makefile") / READ("Cargo.toml") / READ("CI 配置")
- 手动验证可行(截图 / curl / 日志对比)→ 标注验证方式,继续
- NONE → NEEDS_CONTEXT:请用户提供验证命令,记录到
06-tdd-log.md
-
EXEC verify_cmd(测试)→ ASSERT exit_code == 0 && failures == 0
-
EXEC 项目 lint 命令 → ASSERT exit_code == 0
-
EXEC 项目 CI 命令 → ASSERT exit_code == 0
验证协议:步骤 2-4 每次声明"通过"前须执行 _team-rules/verification-protocol.md: 验证执行步骤
- EXEC
git diff --name-only → READ 04-boundary.md deny 列表 → ASSERT 无越界修改
- READ
01-plan.md 预算 → ASSERT 未超出自我约束预算
- ASSERT
TDD 顺序正确 && 未擅自假设 spec && 预算未超支
IF exit_code != 0:
- READ full output → 定位失败原因
- WRITE 失败测试(RED)→ 修复代码(GREEN)→ 仍遵循 TDD
- GOTO Phase 2(从步骤 2 重新运行全部检查)
- WRITE
06-tdd-log.md 修复循环 + WRITE 08-ai-decisions.md 修复决策
ELSE → 继续 Phase 2 下一步骤
不可跳过失败继续后续步骤 _team-rules/first-principles.md: First Principle #4。预算超支砍范围,不放宽预算。
回退路由
精确归因问题根源,将问题送到正确的上游修复。"有问题"不是路由依据——"spec 未定义某个边界"才是。
MATCH issue_type:
spec 遗漏(SDD 未定义某个边界)→ ROLLBACK team-spec(通过编排器,附遗漏点 + 建议补充)
spec 矛盾(03-sdd.md 与 02-context.md 冲突)→ ROLLBACK team-spec(附矛盾位置 + 分析)
spec 范围不合理(04-boundary 禁止了必要修改)→ ROLLBACK team-spec(附修改理由 + 建议调整)
需要人类判断 → ASK_HUMAN(附选项 + 各选项 trade-off)
team-test 报告 bug → 自己修复(仍遵循 TDD:先 RED 再 GREEN)
team-review 报告 P0/P1 bug → 自己修复(仍遵循 TDD)
- DEFAULT → 记录到
08-ai-decisions.md,继续当前流程
自修复仍遵循 TDD:RED(回归测试)→ GREEN(修复)→ 追加 06-tdd-log.md + 08-ai-decisions.md。修复后全量测试确认无回归。
OUTPUT_TEMPLATE
| 文件 | 模板位置 | 说明 |
|---|
06-tdd-log.md | references/06-tdd-log-template.md | TDD 日志(红-绿-重构循环) |
07-prompt-log.md | references/07-prompt-log-template.md | Prompt 工程记录 |
08-ai-decisions.md | references/08-ai-decisions-template.md | AI 决策记录 |
STOP_SIGNALS
- 使用 EnterPlanMode 或其他外部规划工具替代 TDD 循环(plan mode 完成 ≠ RED 阶段完成)
- 编码前没
READ spec,或发现 spec 问题不 ROLLBACK 而自己决定
- 跳过 RED 阶段直接写实现,或先写实现再补测试
- 修改测试让它通过(而非修改实现),或困惑不记录默默假设
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/verification-protocol.md — 5 步验证协议
REF _team-rules/spec-driven-workflow.md — Spec-Driven 开发原则与 TDD 工作流
REF _team-rules/ai-collaboration-standards.md — AI 协作资产与 Prompt 工程规范
实现阶段尤其注意:
- Rule #9 TDD 顺序不可逆:RED 必须在 GREEN 之前,先写实现再补测试则删除代码重新开始
_team-rules/first-principles.md: First Principle #2
- Rule #2 有向图回退:发现 spec 问题必须
ROLLBACK team-spec,不可擅自假设正确行为 _team-rules/first-principles.md: First Principle #4
- Rule #6 自我约束预算:超出预算砍范围,不放宽预算
_team-rules/first-principles.md: First Principle #3
- Rule #8 验证先行:声明"测试通过"前必须执行验证协议
_team-rules/verification-protocol.md: 验证执行步骤 _team-rules/first-principles.md: First Principle #4
SELF_CHECK
GATE 产出前自检(全部通过才放行):
COMPLETION
REF _team-rules/four-state-protocol.md — 四态完成状态
MATCH result:
TDD 完成 && CI 通过 && 边界合规 → DONE(文件: {N} 修改 / {N} 新增, 测试: {N} pass / {N} fail, CI: pass)
完成但有保留意见 → DONE_WITH_CONCERNS(concerns: [...])
spec 不足 → NEEDS_CONTEXT
被阻塞 → BLOCKED
- DEFAULT → BLOCKED
INTEGRATION
被谁调用:
- 用户直接调用(独立使用)
team-orchestrator(编排模式)
team-brainstorm(用户跳过规格阶段时直接路由)
team-feedback(审查反馈修复后重新验证)
配对使用:
team-test — REQUIRED:实现完成后必须进行测试审计
team-debug — 发现 bug 时使用
NEXT
- 实现完成 → 使用
team-test 进行测试审计
- 遇到难以定位的 bug → 使用
team-debug 根因分析