AI 时代的开发流程,
从需求到上线 全周期指南
这份手册给团队所有工程师:我们如何用 AI Agent(终端编码助手)做需求、设计、编码、测试和发布。 重点解决新人最容易懵的分支环境映射、merge/rebase、上线顺序问题。
01六条基本原则
不管在哪个阶段,这六条是判断"这样做对不对"的默认标尺。
02团队协作模式:高内聚,低耦合
AI 时代的协作不是"人 + AI 一起在一个文档里改",而是每个人/每个 Agent 独立负责一块,只交换结果,不纠缠过程。
基本单元:DRI(微型 CEO)+ Agent 集群
每个需求/模块有一个 DRI(Directly Responsible Individual) 对结果端到端负责,周围配一组可调度的 AI Agent 集群。DRI 做判断和担责,Agent 做执行和交付。
| 关系 | 怎么做 | 不怎么做 |
|---|---|---|
| 人 ↔ 人 |
|
|
| 人 ↔ AI |
|
|
| AI ↔ AI |
|
|
传统角色在 AI-Native SDLC 中干什么?
现阶段团队仍区分产品经理、前端、后端、测试,部分人已逐步跨职能。角色边界不是消失,而是从"各管一段"变成"围绕 DRI 补位":
| 角色 | 承担什么 | 不做什么 / 什么时候补位 |
|---|---|---|
| 产品经理 |
|
不写代码、不参与技术选型;评审 spec.md 是否还原业务意图 |
| 架构师 |
|
不逐行写业务代码;核心交易链路架构变更必须过架构师 |
| 前端 / 后端工程师 |
|
超出自己专业领域时(如前端碰复杂 SQL、后端碰交互设计),找对应专业人员补位,不硬扛 |
| 测试工程师 |
|
不重复开发自己跑一遍所有测试——把精力放在评测集建设和人工审核上 |
什么时候必须拉会协同?
高内聚低耦合不是什么都异步。遇到下面这些情况,该拉会还是要拉会:
03分支模型与环境映射(master 单主干 + MR 发布)
模型一句话:只有一条主干 master。feature 一律从 master 切出;要上线就提合并到 master 的 MR——MR 只用来审查和构建部署,prod 验证通过前不合并;多个 feature 要同时上线,就建 release/x.x.x 分支把它们聚合起来构建部署。
分支-环境对照速查
| 环境 | 对应分支 | 部署方式 | 用途 |
|---|---|---|---|
| dev | feature/*(MR 源分支) | Codeup MR 流水线自动部署 | 开发自测、联调 |
| uat | 上线 MR 源分支(单特性)/ release/*(多特性聚合) | 测试手动触发 | 测试/产品验收 |
| prod | 与 uat 同一构建产物;验证通过后 MR 合入 master | 运维手动触发 | 线上生产 |
新手必读:merge 还是 rebase?什么时候用哪个?
这是新人最常问的问题。规则很简单:
| 场景 | 用什么 | 为什么 |
|---|---|---|
| feature 分支更新代码 | git rebase master | 保持提交历史线性,MR 干净 |
| feature 上线 | 提 MR 到 master,Merge(不 rebase) | 保留合并节点,可追溯每次上线包含哪些 feature |
| 多特性同时上线 | 从 master 切 release/x.x.x,把各 feature 分支 merge 进去 | 发布对象 = 多分支聚合,构建部署以 release 分支为准 |
| release 上的 bug fix | 直接在 release 分支提交,不走 feature 分支 | uat 验证对象 = 发布对象;fix 随 release → master 的 MR 合回主干,不允许只存在于 release 的提交 |
新手必读:为什么"构建、部署,但不合并 MR"?
传统流程是"先合并进主干,再从主干部署"。我们把顺序反过来:MR 只作为审查和构建部署的载体,prod 验证通过后才合并。三个理由:
- master 永远等于线上:主干上只出现"已上线且验证通过"的提交,未验证代码不进主干
- 发布对象 = 审查对象:uat / prod 部署的制品和 reviewer 看到的 diff 零偏差,不存在合并时的意外改动
- 回滚不动主干:出问题回滚制品即可,master 不用 revert,不留"合了又撤"的脏历史
| 步骤 | 动作 | 操作方式 |
|---|---|---|
| 1 | feature 完成,提 MR → master | Codeup 建 MR,CI 全量门禁自动跑 |
| 2 | review 通过后不合并,构建部署 | 单特性:直接部署 MR 源分支;多特性:合入 release/x.x.x 后部署 release |
| 3 | uat 验收 → prod 发布 | 运维部署同一构建产物,观察 30 分钟监控 |
| 4 | 验证通过,最后一步才合并 | 单特性:点合并 MR;多特性:提 release → master 的 MR 合入、打版本标签、删 release 分支,本批各 feature 的 MR 标注"已随 release/x.x.x 合入"后关闭 |
新手必读:MR 什么时候合并?正确顺序是什么?
以一个 feature 上线为例,正确顺序是:
- 从 master 切出
feature/xxx,本地跑 lint + 单测 - 提 MR 到 master,等资深工程师 review(只审查,不合并)
- MR 流水线自动构建,部署 MR 源分支到 dev
- dev 环境验证没问题
- 需要上线:通知测试部署该 MR 的构建产物到 uat(多特性同时上线:从 master 切
release/x.x.x合入多个 feature 分支,测试部署 release) - uat 验证通过(测试 + 产品验收)
- 运维把同一构建产物发到 prod
- 盯 30 分钟监控,确认没问题后合并 MR——这一刻 master 才更新
MR 创建后,Codeup 自动部署 dev 的完整机制
MR 创建 / 更新触发两段流水线:MR 校验 + 部署验收。全程不需要合并 MR,两段各自独立:
两段流水线
| 阶段 | 做什么 | 失败怎么办 |
|---|---|---|
| MR 校验 | 只检查单个项目的问题:Lint、单测、构建 | 红灯进不了发布流程,改到绿再提 |
| 部署流水线 | 基于 MR 源分支重新构建制品 → 部署 dev → 单应用 + 跨应用端到端验收 | 见下方失败处理 |
失败处理与回滚
- 服务不可用(部署后探活失败、进程起不来)→ 自动回滚到上一个无问题构建产物
- 测试脚本失败(验收用例挂了)→ 人工介入,由 DRI 决定是否回滚(可能是脚本本身写错了)
- 回滚目标:上一个"部署后验证通过"的构建产物(制品回滚),不是回退代码分支。该原则同样适用于 prod(见 Deploy 章节)
- 回滚后:MR 源分支不 revert,标注"dev 验证失败",在 feature 分支修复后推送,MR 自动更新重跑流水线
DB 迁移
- feature 开发时就要一起提供数据库回滚脚本(up + down 成对)
- 没提供回滚脚本 = 说明该变更不需要回滚数据库,写清楚即可
- 迁移失败 → 用 down 脚本回滚数据,再回滚制品
跨应用验收
交易链路涉及多个服务,验收采用各自独立验收:A 服务部署完就验收 A(含对 B 的契约调用验证),不等 B 也更新完。跨应用契约在 spec.md 里定义,验收时按契约 mock 或真实调用验证。
两个特性一起上线,一个能上、一个不能上,怎么办?
A、B 都完成开发并通过 dev 验证,本打算一起上线,但 B 因为外部条件(依赖方没就绪、运营窗口错不开)不能随本批发。核心原则:上线什么由 release/* 聚合进来哪些分支决定,不由"代码已完成"决定。
两个方案
| 方案 | 做法 | 适用 |
|---|---|---|
| 1. 本批不聚合 B(默认做法) | release/* 只合入 A 的 feature 分支;B 的 MR 保持锁定,留到下一批 release/* 一起上 | 绝大多数场景——B 的代码本来就没合进 master,"不上 B"是零成本操作 |
| 2. Feature Flag | B 与 A 的改动拆不开(共享代码、契约变更)时,A、B 一起进 release/*,B 的变更用开关默认关闭,上线后条件满足再打开 | 耦合改动拆不开;交易链路灰度 |
单主干模型下不存在"先合并再摘除":MR 在 prod 验证通过前不合并,"不上 B"就是聚合时不带 B 的分支,无需 git revert 手术。B 等待下一批期间按规则 git rebase master 同步主干,避免基线漂移。
04六个阶段怎么做
每个阶段都给出核心做法和常见坑。项目记忆文件和命令以当前团队使用的 Agent 工具为准,直接照做即可。
每阶段产出物总览
| 阶段 | 产出物 | 谁写 / 谁审批 | 过不了怎么办 |
|---|---|---|---|
| 1. Plan | intent.md | intent.md(业务意图、验收标准)内容由产品经理主笔(经工单需求模板提供,DRI/工具转成仓库文件)、产品负责人审。工单管状态排期,intent.md 管内容——双向一行链接,重叠字段为零 | 没想清楚就别动手,写大白话想法让 AI 追问 |
| 2. Design | spec.md | 架构师、工程师写;产品负责人确认业务还原,资深工程师 review 技术方案 | spec 定方案与契约边界(技术方案、接口契约、数据模型、DDL 及回滚)——这就是"怎么做"的设计部分;实现步骤留给 plan.md |
| 3. Build | plan.md + 代码 + 测试 | plan.md 由 DRI 基于 spec.md 转抄撰写、DRI 审;代码 DRI 写并自审 | 模块清单 / DB 变更必须是对 spec 的转抄而非预测;评审 plan 即校验 DRI 是否读懂 spec |
| 4. Test | Evals 评测集 | 测试工程师兜底完备性;自动回归 | 20-50 个真实任务,掉分禁合并(设计中:集子未建,见 07 路线图⓪) |
| 5. Deploy | 无(发布流程环节,不新增文档产出) | 人(DRI)最终审批 | AI 先审查标记问题,Hooks 拦截违规部署 |
| 6. Maintain | 新 intent.md | AI 诊断 → 人确认 | 监控指标异常 → AI 诊断 → 自动回到 Plan 阶段 |
怎么做
- 需求开始前,先确认
intent.md(业务意图、目标、验收标准)就位;没有就先补,再动手。真相源字段切分:工单系统管状态(要不要做、优先级、排期、验收流转),intent.md管内容(唯一内容真相源,随代码进版本库)。双向一行链接:工单描述里只放intent.md的仓库路径,intent.md头部保留工单号——重叠字段为零,漂移无处发生。PM 经工单需求模板提供内容(字段与 intent 章节一一对应),格式转换由 DRI / Agent 代劳。 - 顺序铁律:
intent.md(Plan)→spec.md(Design)→plan.md(动手编码前)。实现计划必须知道"改哪些模块、有没有 DDL、风险在哪"——这些是设计决策的输出,所以在 spec 定稿之后写,模板见 Build 章节。不允许在 spec 之前凭预测填模块清单和数据库变更。 - 自己先过一遍"陌生人测试":没参与讨论的人拿到 intent + spec 能直接做吗?不能就补。
- 用 Agent 的 Plan Mode 启动,让它先输出实现计划,你确认后再让它写代码。
- "帮我加个订单取消功能"——Agent 会自由发挥,产出你不要的东西
- 验收标准写"用户体验更好"——不可机器判定,没法测试
- 涉及数据库变更但没写回滚脚本——交易链路回滚可能要运维帮忙
怎么做
- 让 Agent 先列 2-3 个候选方案和各自的取舍,不要让它直接选一个就写。
- 涉及订单、支付、库存、资金这些核心链路的改动,方案必须给资深工程师过一眼。
- 重要决策写在 MR 描述里:为什么这么做、放弃了什么、什么条件下会推翻。
- 明确告诉 Agent 不能动什么:不要改 legacy 模块、不要新增依赖、不要破坏现有接口契约。
spec.md评审通过后,DRI 基于 spec 写plan.md(实现步骤、模块改动清单、DDL 及回滚、验收标准到测试的映射)——模块与 DB 声明是对 spec 的转抄,不是预测。模板见 Build 章节。
- 让 Agent 同时做设计和写代码——它会选最容易写的方案,不是最合理的
- 设计只在聊天记录里——下次会话 Agent 就忘了,会重新发明轮子
每次新会话必须做的事
- 在仓库根目录放
AGENTS.md(Agent 会自动读取),写清楚项目规范。 - 用 Agent 的 Plan Mode 启动:先让它出计划,你确认后再动手。
- 一次只让 Agent 做一个小改动——写完、跑测试、确认,再让它做下一个。
- 独立任务(比如写接口 + 写测试)可以用 Subagents 并行,但最后你统一 review。
- 关键决策写入项目记忆(omp 用
/memory retain;其他工具用其等价机制,如 CLAUDE.md 追加),下次会话不用重新说。
AGENTS.md 模板(本团队)
# 项目:XXX 服务 技术栈:Java 17 / Spring Boot / MySQL / Redis / Kafka # 常用命令(与硬门禁清单 ① 本地开发五项一一对应) - 格式:mvn spotless:apply - 静态检查:mvn checkstyle:check pmd:check spotbugs:check - 编译:mvn clean compile - 单测(改动模块):mvn test -Dtest=你改的类 - 全量测试:mvn test 提交前五项必须全绿(以本清单为准,与 CI 门禁保持同步)。 # 代码规范 - Controller 只做参数校验和路由,业务逻辑在 Service - 数据库操作必须走 Mapper,不要在 Service 里拼 SQL - 业务异常继承 BizException,错误码统一管理 - 交易链路接口必须加幂等设计 # 不能做的事 - 不要动 src/legacy/ 目录 - 不要引入新的第三方库(需要先问 Tech Lead) - 不要在循环里调用 RPC 或数据库查询 - 所有对外接口必须写参数校验和异常处理
docs 目录:业务知识沉淀(人审受控)
每个项目根目录 docs/ 下放业务文档——Agent 懂代码结构,但不懂业务语义。
- 放什么:业务场景说明、状态机、交易规则、接口契约——这些是人审受控文档:只能随代码同 MR 由人更新,Agent 不得自行改写(Agent 是 docs 最重度的消费者,不能既当读者又当作者)
- 怎么更新:改业务逻辑必须先改 docs 再改代码,同一个 MR。不允许只改代码不改 docs
- 多久 review:每季度 DRI 过一遍 docs 是否过时,过期的比没有更危险。review 落痕:在
docs/REVIEW-LOG.md追加一行(日期 / DRI / 结论),没记录 = 没做过
Skills 库(awesome-rules 仓)
高频操作沉淀成可复用的 Skill,存在 awesome-rules 仓,不用每次重新跟 Agent 描述。项目里引用即可。
- 怎么用:在 AGENTS.md 里引用需要的 Skill,Agent 按需加载,不用全塞进上下文
- 沉淀时机:同一个操作跟 Agent 描述过 3 次以上,就该写成 Skill 放进 awesome-rules
- 已有示例:查线上日志、写 SQL 排查、生成回滚脚本、MR 描述模板等
展开:当前 Agent 工具命令速查(以 omp 为例,换工具时找等价命令)
| 命令 | 用途 |
|---|---|
/memory view | 查看当前项目已记住的内容 |
/memory retain <事实> | 把重要决策存为长期记忆 |
| Plan Mode 启动 | 当前工具默认先出计划再执行,确认后才改代码 |
| Subagents | 独立任务并行派发,主会话把关 |
展开:多 Agent 并行开发——用 git worktree 隔离会话
同时跑多个 Agent 会话(一个改接口、一个写测试、一个重构),如果在同一个目录里,两个 Agent 会互相覆盖文件、git 状态打架。正确做法是每个 Agent 一个独立 worktree:同一个仓库,多个工作目录,各 check out 各的分支。
worktree 并行示意
标准操作流程
# 假设主仓库在 ~/repo/order-service # 1. 为任务 A 建一个独立 worktree(新目录 + 新分支) git worktree add ../order-A feature/order-cancel # 2. 为任务 B 再建一个 git worktree add ../order-B feature/order-refund # 3. 两个终端分别进去,各启动一个 Agent cd ../order-A && omp cd ../order-B && omp # 4. 各自开发、各自提 MR # 5. 任务完成后清理 worktree git worktree remove ../order-A git worktree remove ../order-B
为什么不用分支切换就行?
- 切换分支要 stash 当前未提交的改动,来回切很容易丢东西
- 两个 Agent 会话都有自己的上下文(已打开的文件、记忆),切分支会搞混
- worktree 共享同一个 .git 对象库,不占额外磁盘存两份代码
注意事项
2. 不要在两个 worktree 改同一个文件:合并时必冲突。并行任务提前拆清楚文件边界。
3. 数据库:多个 worktree 连同一个本地库没问题,但跑迁移脚本前确认其他 worktree 不在跑测试。
4. 用完就删:任务合并后立刻
git worktree remove,不然目录越堆越多。5. 查看有哪些 worktree:
git worktree list。
什么时候用 worktree,什么时候用 Subagents?
| 场景 | 用什么 |
|---|---|
| 一个需求里的两个独立子任务(写接口 + 写测试) | Subagents:同一个 Agent 会话里派,上下文共享,你统一 review |
| 两个完全独立的需求/任务,要长时间并行 | worktree:两个独立 Agent 会话,互不干扰 |
| 一个人同时修 bug + 做新功能 | worktree:bug 要紧急合,新功能还没好,别互相等 |
plan.md 模板(动手编码前写,基于 spec.md 转抄)
plan.md 在 spec.md 评审通过后、编码前撰写。评审 plan = 校验 DRI 是否读懂 spec。
展开:plan.md 完整模板(交易链路适用)
# Feature: <名称> 关联需求:JIRA/工单号 ## 目标 一句话。例:订单超时未支付自动取消并释放库存。 ## 非目标 - 本次不做退款流程 - 本次不改消息推送模板 ## 验收标准 - [ ] 订单超过 30 分钟未支付,状态变为 CANCELLED - [ ] 取消后库存自动释放回可用库存 - [ ] 用户收到取消通知(短信+站内信) - [ ] 重复取消不产生副作用(幂等) ## 涉及模块 - 修改:order-service / 定时任务 / 库存服务 - 新增:取消订单的领域事件 ## 数据库变更 - 是否有 DDL:是/否 - 如有,回滚脚本:xxx.sql ## 风险 - 风险描述(例:并发取消导致超卖)→ 只登记风险,缓解方案见 spec.md - 回滚方式:feature flag / 回退代码重发
三步写代码:计划 → 写 → 自查
- 先出计划(plan.md):工程师审计划,消除模糊后再动手。先改文档返工更轻。审的时候核对:模块清单与 DB 变更是否与 spec.md 一致(转抄而非预测)——不一致要么改 spec 走设计评审,要么改 plan,不许两边各说各话。
- AI 写代码:按计划一步步写,每步跑测试。
- AI 自查:写完自动跑测试 + 构建,全部通过才算完成。不通过自己改,最多 5 轮。
陌生人 Reviewer 闭环(核心场景)
参考 Peter Steinberger(OpenClaw 之父)的做法:主 Agent 写完代码后,唤起一个全新空白上下文的子 Agent 当 Reviewer,双方来回辩论:
- 主 Agent 写完代码,唤起空白 Reviewer:"帮我把刚才改的代码全盘过一遍"
- Reviewer 挑出问题回传给主 Agent
- 主 Agent 辩解或认错修改,改完再提交给 Reviewer
- 来回拉扯最多 10 个回合;第 10 回合仍未收敛即升级人裁决,双方意见全文留入 MR 描述,不无限辩论
跑与不跑按各项目 review-scope.yml 定义的人审范围执行:定义为核心链路的必须跑,之外可选。成本预期:核心链路 MR 预留 1-2 小时,排进发布节奏。
- 一个 prompt 让 Agent 改 5 个文件——review 起来你会崩溃
- 让 Agent 自己说"完成了"就算完——必须你自己跑测试确认
- 无限制让 Agent 改——最多 5 轮自修复,超过就人工介入
怎么做
- 让 Agent 写代码的同时把单测一起写了——不要留到最后补。
- 本地必须跑通:lint + 单测全绿,再提 MR。
- CI 红灯不要 skip——让 Agent 看日志、改到绿为止,最多 5 轮。
- 交易链路的改动,必须补边界 case:空值、并发、幂等、异常路径。
- 改完测试跑全量,不要只跑你改的那个文件。
AI 写的测试,信多少?
| 场景 | 信任程度 | 你要做什么 |
|---|---|---|
| 非核心场景(后台管理、内部工具、CRUD) | 基本全信 | 抽查断言是否真的验证了逻辑,而不是空跑 |
| 核心交易链路(下单、支付、退款、对账) | 必须人工审核 | 逐行看测试用例、边界覆盖、断言强度,Agent 写的测试可能"为了绿而绿" |
Evals 评测闭环(核心场景)
光靠单测不够——核心链路要维护一个 20-50 个真实任务的评测集,每次代码变更或 Agent 配置变更都自动跑一遍,通过率掉了就禁止合并。
现状(v2.3.1 纠偏,2026-10 盘点):gtsp-wop-service 的单测层变异门禁已上线(PIT:3233 变异体、击杀率 89-92%、pre-push 阈值 89)——"用变异证明用例有效"的纪律已在单测层运转;但 agent 任务级 Evals 评测集尚未建立,本节为设计目标,起步需先摸底用例来源(历史 bug 回放是最便宜的第一批)。
- 同等待遇(3 个月内接线,排期第一优先):代码变更和 Agent 配置变更(AGENTS.md / review-scope.yml / Skills / Hooks 改动)一视同仁都要跑 Evals——当前 CI 仅代码变更触发。接线前,review-scope.yml 的 TL 闸门是配置治理的唯一防线,这也是把接线排第一的原因
- 持续回归:不是提测前才跑,每次 MR 自动跑
- 掉分禁合并:通过率比基线低就红,不许强合。基线三条纪律:① 初始基线 = 评测集首次全量跑通率,记录在仓(如
evals/baseline.json);② 基线只升不降,下调需 MR + Tech Lead approve 并留痕;③ 新用例合入时基线重算为 min(当前通过率, 旧基线),新用例不得放松旧约束 - 用例上岗纪律:一个用例必须先证明自己能抓差异,才能参与基线——从未抓到过差异的评测集配上"掉分禁合并",等于用随机数挡合并:拦不住真 bug,却会拦住真功能。两条路径任选:① 回放历史 bug(线上事故转的用例天然合格);② mutation 变异测试——对被测代码做人工变异(改边界、删幂等检查),用例必须变红。从未变红的新用例挂「观察」状态:不进基线、不触发禁合并。已有集子的仓先做一轮变异体检(一天工作量),抓不到差异的标「观察」;集子还没建的仓(现状 = 多数),首批用例从历史 bug 回放起步、天然走路径①
- 线上 bug 转 Evals:每次线上修复后,补一个评测用例进集子里,下次自动检测
- 用例退役:连续 6 个月未捕获差异且业务已下线的用例,评测集 owner 可提 MR 退役并留痕(防止集子只增不减变成新屎山)
- CI 红了就找"赶上线"理由跳过——下次技术债翻倍还
- 让 Agent 删掉跑不过的测试来"通过"——这是在掩盖问题
- 只测 happy path——交易链路出问题都在异常路径
发布流程(务必照做)
- 提 MR → master:feature 开发完成后提 MR 合到 master。MR 只作为载体——人审 + CI 构建,不合并(Codeup 分支保护锁定合并:prod 验证通过前谁都不能点合并)。
- MR → dev:MR 流水线自动构建,部署 MR 源分支到 dev,你自己验证。
- uat 验证:单特性——通知测试部署该 MR 的构建产物到 uat;多特性同时上线——从 master 切
release/x.x.x,把要一起上线的 feature 分支合入,测试部署 release。release 只修 bug,不加新功能;bug fix 一律在 release 分支上直接提交(保持 uat 验证对象 = 发布对象),随 release → master 的 MR 合回主干——不允许只存在于 release 的提交。 - prod 发布:uat 通过后,运维把同一构建产物发到生产,发布后盯 30 分钟监控。
- 合并收尾(最后一步):prod 验证通过后——单特性点合并该 MR;多特性提 release → master 的 MR 合入、打版本标签、删 release 分支,本批各 feature 的 MR 标注"已随 release/x.x.x 合入"后关闭,不留挂起的僵尸 MR。合并前 master 不动,保证 master 永远等于线上。
- 同步 feature:master 前进后,通知未上线的 feature 分支
git rebase master——所有分支都从 master 切出,主干动了自己要跟上。
紧急回滚怎么做
展开:线上修复流程(生产事故后——按普通特性流程走)
- 回滚、定位后,从 master 切出
feature/fix-xxx分支修复——与普通新特性完全同路,不设 hotfix 特殊分支 - 本地门禁照跑:lint + 单测,不豁免
- 提 MR 到 master,走同一发布流程:只审查 + 构建 + 部署,prod 验证通过前不合并——线上事故也不例外,紧急靠优先排 review 与部署解决,不裁剪门禁
- 运维部署该 MR 构建产物到 prod,照常盯 30 分钟监控;验证通过后合并 MR、打补丁版本标签
- master 前进后,通知未上线的 feature 分支 rebase master——与普通上线相同
- 走「翻车复盘三步闭环」(见 Maintain 章节)
哪些路径必须资深 review
| 敏感路径 | 要求 |
|---|---|
| 核心链路 · 高风险档(契约变更、资金/结算逻辑、DDL、状态机) | 必须资深工程师 + Tech Lead 双人 review |
| 核心链路 · 低风险档(docs/、日志、注释、测试、纯内部重构且测试全绿) | 资深单人 review + 强制陌生人 Reviewer 闭环。分层标准以各项目 review-scope.yml 为准;单审 reviewer 拿不准或 Reviewer 10 回合未收敛时升级 TL。启用前置:先做双审排队量化分桶(近 3 个月 git/Codeup 数据,按核心/非核心 × 排队时长),确认瓶颈在核心链路再启用;若根因是资深人手总量不足,分层无效,加人 |
| 数据库 DDL / 表结构变更 | 必须有回滚脚本,提前告知运维 |
| 对外 API 接口变更 | 不能 breaking change,新增字段可以,删改必须兼容 |
| 权限、鉴权相关 | 必须资深 review |
| 普通工具类 / 内部后台 | 一人 review 即可 |
- 先合并 MR 再部署——合并是 prod 验证通过后的收尾,master 不进未验证代码
- release 分支上继续加新功能——要上新功能提新 MR,等下一批合入 release
- uat 没测完就发 prod——交易链路出问题代价很大
- 出问题先慌着改代码——先回滚止血,再修
- prod 发布后,自己盯 30 分钟。判定基准(占位,按实际监控能力校准):错误率 > 发布前 1 小时基线的
2 倍、核心接口 P99 超基线30%、订单量低于上周同期70%,任一命中即触发回滚评估。监控入口:【dashboard 地址/命令待填】。 - 触发权:观察期内 DRI 有权直接呼叫运维回滚,不需要再审批。发现问题先关流量/回滚,再定位原因。
- 踩过的坑(比如某个配置项容易漏、某个边界 case 没想到)写入项目记忆(omp 用
/memory retain;其他工具用等价机制)记下来。 - 定期让 Agent 扫描热点路径,提性能优化 MR(这是后面的事,先把手头流程走顺)。
翻车复盘三步闭环
线上出问题后,光写复盘文档不够——要确保 Agent 下次不再犯同样的错:
- 写复盘文档:存档,讲清楚什么问题、根因、影响
- AGENTS.md 加一条"别再犯":把教训写进项目规则,Agent 下次自动遵守
- Evals 加一个用例:下次自动回归,再犯直接红
三步走完才算复盘结束。只写文档不加规则和评测 = 下次还会犯。
05硬门禁清单:每个环节必须过什么
硬门禁 = 红灯就不能往下走,没有"赶上线"例外。按本地开发 → MR → uat → prod 四个环节逐层加严。
Agent 权限与安全边界(红线)
| 边界 | 规则 |
|---|---|
| 代码推送权限 | Agent 无权直接 push 到 master,只能通过 feature/* 分支提 MR,由人 review;MR 在 prod 验证通过前处于合并锁定状态,Agent 更无权点合并 |
| 生产数据库 | 可读不可写;敏感表/敏感字段(用户手机号、身份证、交易密码相关)配置不可访问,Agent 查不到 |
| 密钥与凭据 | Agent 不能读取配置中心生产密钥;开发环境密钥脱敏后使用 |
| 部署权限 | Agent 不能触发 uat / prod 部署,只能跑 dev 环境自动流水线 |
| 提交身份 | Agent 提交一律使用本人 git 身份,commit message 带 AI 署名标注(如 Co-Authored-By: <agent> trailer)——回溯、缺陷率分桶统计、责任定界都依赖它 |
| AI 产出标注 | MR 标题或标签标明 AI 辅助程度(纯 AI / AI 辅助人写),与 MR 描述里建议附的 Prompt 摘要互相印证(摘要为建议性信号,不作门禁,见 08 节) |
- Claude Code hooks(Agent 动作时拦截,覆盖 Claude 会话):docs/ 目录写入拒绝、
src/legacy/触碰拒绝、白名单外新增依赖拒绝、生产密钥/敏感字段读取拒绝。 - CI 兜底(覆盖非 Claude 工具会话,三条都是便宜的 diff 检查):① MR 触碰
docs/但未触碰src/→ 红灯;② diff 触碰src/legacy/→ 红灯(白名单 MR 例外);③pom.xml新增白名单外 dependency → 红灯。 - Codeup 分支保护:Agent 无 push
master权限、MR 合并锁定到 prod 验证通过、review 人数要求、review-scope.yml 变更须 TL approve。
① 本地开发(你自己跑,跑不过别提 MR)
| 门禁 | 检查什么 | 命令 |
|---|---|---|
| 代码格式 | 缩进、import 顺序、命名风格统一 | mvn spotless:apply 或 checkstyle |
| 静态检查 | 空指针、未关闭资源、可疑写法、循环里调 RPC/DB | mvn checkstyle:check pmd:check spotbugs:check |
| 编译通过 | 类型错误、依赖冲突 | mvn clean compile |
| 单元测试 | 你改的模块的单测全绿 | mvn test -Dtest=你改的类 |
| 大测试全量 | 确认没改坏别的地方 | mvn test |
② MR 到 master(Codeup CI 自动跑,红灯不能进入发布)
| 门禁 | 检查什么 | 级别 |
|---|---|---|
| 编译 + Lint | 和本地一致,CI 上再跑一遍 | 硬阻断 |
| 单元测试全量 | 所有单测必须绿 | 硬阻断 |
| 测试覆盖率 | 新增代码覆盖率 ≥ 80%,总覆盖率不能比 master 低 | 硬阻断 |
| 依赖漏洞扫描 | 第三方库有没有已知 CVE | 硬阻断(高危与中危均拦) |
| MR Review | 人审范围按各项目 review-scope.yml 定义:核心路径(交易链路 / DB / 对外接口 / 权限)强制人审,交易链路高风险档 = 资深 + TL 双人;非核心修改可由 Agent review 替代人审(只替代 review 环节;MR 合并仍锁定到 prod 验证通过)。review-scope.yml 自身的变更必须 TL approve,不适用 Agent-review-替代 | 硬阻断 |
| 不能 draft 直接合 | 草稿 MR 必须标记 ready 才能合 | 硬阻断 |
| commit 规范 | commit message 符合规范(feat/fix/refactor 开头) | 建议,暂不硬卡 |
③ 上线对象:MR 源分支 / release/*(发 uat 前,比 MR 阶段更严)
| 门禁 | 检查什么 | 级别 |
|---|---|---|
| 上面所有 + | MR 阶段全部门禁在上线对象(MR 源分支 / release/*)上再跑一遍 | 硬阻断 |
| 集成测试 | 跨服务接口联调测试通过 | 硬阻断 |
| DB 变更检查 | 有 DDL 必须配套回滚脚本,提前通知运维 | 硬阻断 |
| 关键接口冒烟 | 核心交易链路接口 P99 耗时不超过基线 | 提示,超标要说明 |
④ prod 发布前(人工 + 流程门禁)
| 门禁 | 检查什么 | 谁来确认 |
|---|---|---|
| uat 验收通过 | 测试和产品在 uat 上点过 | 测试 + 产品 |
| 变更记录 | 发布内容、影响范围、回滚方式写清楚 | 开发自己写 |
| 回滚方案确认 | 出问题能不能 5 分钟内回退;含 DDL 的发布必须演练过 down 脚本 | 开发 + 运维 |
| 运维审批 | 通知运维发 prod,确认窗口 | 运维 |
| 发布后观察 | 盯 30 分钟错误率 / 核心指标 | 开发自己盯 |
06一次需求从开发到上线的完整 SOP
新人入职第一个需求,照着这张清单一步步走,不会错。先看谁做什么、再看时间顺序。
RACI 责任矩阵:每件事谁负责
| 活动 | 开发 | 资深/TL | 测试 | 产品 | 运维 |
|---|---|---|---|---|---|
| 写 intent.md(业务意图) | C | I | — | R/A | — |
| 写 plan.md / 技术方案 | R | A | C | C | I |
| 写代码(AI Agent 辅助) | R | I | — | — | — |
| MR Review | — | R/A | — | — | — |
| dev 环境验证 | R/A | — | — | — | I |
| dev 环境回滚(制品) | R/A | — | — | — | I |
| 部署 uat | — | — | R/A | — | — |
| uat 验收 | C | I | R | R | — |
| 部署 prod | — | — | — | — | R/A |
| prod 上线观察 | R/A | C | — | I | I |
| 生产回滚 | C | A | — | — | R |
R = 执行负责 A = 最终负责 C = 需要咨询 I = 知会 — = 不参与
一次需求的时序图
intent.md 由 PM 经工单需求模板提供内容(工单管状态、intent.md 管内容、双向一行链接);Design 产出 spec.md 后,再基于 spec 写 plan.md(转抄非预测),自己改到"陌生人能照做"。涉及数据库变更必须写回滚脚本。feature/xxx,用 Agent Plan Mode 开发。一次做一个小改动,跑通再继续。release/x.x.x 合入多个 feature 分支,测试部署 release。配合测试和产品验收。07团队接下来的落地路线
现状已经有 Codeup 流水线和硬门禁,下一步按这个顺序补:
第一个试点怎么选?
不要上来就动支付核心。试点选对了,团队有信心;选错了,翻车一次就推不动了。按这个原则挑:
| 维度 | 选什么样的 |
|---|---|
| 复杂度 | 中等——不是 CRUD 太简单(看不出 AI 价值),也不是核心交易链路(翻车代价大) |
| 失败代价 | 出错不影响钱、不影响用户,最多内部功能不好用 |
| 代码质量 | 已有测试覆盖、文档还可以——不然 Agent 在屎山上写代码,你 review 都看不懂 |
| owner | 找一个愿意试、心态开放的工程师当种子用户,别强推 |
| 大小 | 2-3 周能做完一个完整需求——太快没体感,太慢看不到结果 |
怎么度量 AI 真的提效了?
凭感觉不算。每月看一次这几个指标,对比用 Agent 前后的变化:
| 指标 | 看什么 | 目标方向 |
|---|---|---|
| MR 周期 | 从提 MR 到 review 通过的时间 | 变短 |
| 返工率 | MR 被打回改超过 2 次的比例 | 下降 |
| 生产 bug 数 | 上线后 1 周内提 bug 的数量 | 不上升(这是底线) |
| 人 review 时长 | 一个 MR review 平均花多少分钟。解读批注:变长时先排查人审产能瓶颈(双审排队),再归因 AI——两者混判会得出「AI 提效失败」的假结论 | 不应该变长 |
基线怎么建:用 Agent 之前 3 个月的 git 历史数据算出来,每月对比看趋势。第一个月别期待太大,看方向不看绝对值。
技术债分级偿还
| 级别 | 什么样的债 | 什么时候还 |
|---|---|---|
| 红色(必须现在还) | 影响交易正确性、有安全风险、阻塞别人开发 | 下个迭代必须还,不许拖 |
| 黄色(计划还) | 代码丑、重复、性能小问题、缺注释 | 排进季度规划,跟着需求一起还 |
| 绿色(记录但不急) | 命名不优雅、小重构机会 | 写到 TODO,下次碰这块代码时顺手还 |
新人第一天 Checklist
| 顺序 | 做什么 |
|---|---|
| 1 | 读这份手册全文(30 分钟),重点看分支模型映射(03 节)和硬门禁 |
| 2 | 装环境:JDK 17、Maven、本地 MySQL/Redis、Codeup 账号、Agent 工具 |
| 3 | clone 主仓库,读 AGENTS.md 和 docs/ 目录下的业务文档 |
| 4 | 跑通 mvn clean package + 本地起服务,确认能打开首页 |
| 5 | 找你的 buddy(指定带你的资深工程师),选一个小需求开始第一个 MR |
| 6 | 第一个 MR 不要用 Agent——手动写,理解清楚流程后再用 |
08Review AI Agent 产出时重点盯这些
除了常规代码质量,AI Agent 生成的代码有几个特有的危险信号,review 时重点看:
展开:Prompt 摘要模板(5 行,MR 描述直接用)
## Prompt 摘要 - 背景:一句话说清这个 MR 解决什么问题 - 关键决策:2-3 条(为什么选这个方向、改了哪些边界条件) - 被否方案:1 条(试过什么、为什么放弃) - 遗留问题:有则写,无则删掉本行 (以上由人撰写;敏感数据已打码)
| 信号 | 为什么危险 |
|---|---|
| 删测试 / 跳过测试 | 为了让 CI 绿而删掉暴露问题的测试 |
| 重复造已有轮子 | Agent 没检索到仓库已有实现,写了个重复的 |
| 一次 MR 跨多个模块 | 违反小批量原则,review 难度指数上升 |
| 新引入未在 AGENTS.md 评估的依赖 | 可能违反许可证或安全要求 |
| diff 偏离 plan.md | 没记录的设计变更,要问为什么 |
| 循环里调 RPC / DB | 性能大坑,AI Agent 常犯 |