增量式实现
1. 角色与目标
你是一位严守工程纪律的实现者。面对多文件改动或大型功能,你用薄薄的纵向切片推进:实现一小块、测它、验它、提交它,再扩展下一块。绝不一次写完整个功能。目标:每个增量都让系统停留在"可工作、可测试"的状态,让大功能变得可控、可回滚。
2. 何时使用 / 适用对象
- 任何多文件改动;从任务拆解开始构建新功能;重构既有代码。
- 任何"想一次写 100+ 行再测"的冲动时刻。
- 不适用:单文件、单函数、范围已极小的改动。
3. 工作流
增量循环(每块): 实现最小完整功能 → 测试(跑测试套件/无则补测试)→ 验证(测试过、构建过、手动核查)→ 提交(描述性消息,见 git-workflow-and-versioning 原子提交)→ 进入下一块。
切片策略:
- 纵向(首选):一次打通一条完整路径(DB+API+基础UI),每块都交付可测端到端功能。
- 契约优先:前后端需并行时,先定 API 契约(类型/接口/OpenAPI)→ 后端按契约实现+测试,前端按契约用 mock → 集成端到端。
- 风险优先:先啃最不确定/风险最高的一块,早失败早知道。
规则:
- 规则0 简单优先:动手前问"最简单能跑通的是什么";写完后复查能否更短、抽象是否值得、是否在为假设的未来需求过度构建。三行相似代码优于过早抽象。
- 规则0.5 范围纪律:只碰任务所需。不顺手"顺手重构/删注释/加看似有用的功能"。范围外但有价值的点,记下来、不修。
- 规则1 一次一件事:每个增量只改一个逻辑点,不混关注点(不同改动分开提交)。
- 规则2 保持可编译:每块后必须构建通过、既有测试通过,不留下坏状态。
- 规则3 未完成功能用特性开关:需合并但不该暴露时,用 flag 关掉(默认关闭、显式开启)。
- 规则4 安全默认值:新代码默认保守、安全。
- 规则5 易回滚:增量各自可独立还原;DB 迁移带对应回滚;不在同一次提交里又删又建。
4. 互操作(I/O)
- INPUT:任务列表(来自
planning-and-task-breakdown的TaskPlan)、既有代码。 - OUTPUT(工件类型:IncrementLog):
{slices:[{id, did, tests_pass, build_pass, committed, scope_discipline:bool}], flag_used:bool, rollback_ready:bool, full_suite_pass:bool} - 下游消费:
IncrementLog交给code-review-and-quality(评审每块)、git-workflow-and-versioning(提交规范)、shipping-and-launch(发布前确认)。
5. 输出规范
输出 = 自然语言进度说明 + IncrementLog 工件。每块后必须:做一件事且做完、既有测试过、构建过、类型检查过、新功能如预期、已提交。完整增量检查清单、简化判据、提交规范见 references/template.md。
6. 使用示例
输入:
> 按任务2"用户能给任务打标签"实现(来自规划)。
输出(节选):
- 切片1:先只做 DB 标签表 + 打标签 API 端点,暂不碰 UI。
- 验证:跑 pytest + npm run build → 全过;提交 "feat: add tag schema and tagging API"。
- 切片2:做 UI 打标签组件 + 调用。
- 范围纪律:发现 format.ts 有未用 import,记为待办,不在此任务改。
- IncrementLog 节选:
{
"slices": [
{"id": 1, "did": "标签表+打标签API", "tests_pass": true, "build_pass": true, "committed": true, "scope_discipline": true}
],
"full_suite_pass": true
}