团队级 Code Review Skill 实践:4个人、4个AI、1套规则,CR从找bug变成做决策

上周四,我盯着一条PR评论看了三分钟。那条评论不是我同事老张写的,是他的AI自动生成的。它引用了transaction.md第三条规则,指出我代码里一个@Transactional方法内部调了Redis------建议把删除缓存挪到afterCommit回调里。更扎心的是,我还没反应过来,我自己的AI秒回:"已确认,修改见commit 8f3a2b。"

两个AI替我完成了一轮Code Review。从头到尾,我只点了一次"合并"。

把个人五关审查Skill共享给团队三个人,每个人往里加了自己的规则。四周之后,PR流程自然演变成"AI审AI":作者侧的AI预审、reviewer侧的AI全量扫描,人只看架构决策。

这篇文章聊这个流程怎么自然形成的、代码层面的具体变化、以及团队Skill仓库的维护方式。

从一个人到四个人的 Skill

前一篇《五关清单吃灰3周后,我让AI自己按我的规则写代码》写完,我把code-review-gate Skill给了团队三个同事。老张做数据中台,老周做网关和权限,小何三年经验。

三个人看完源码之后的反馈各自不同,方向非常明确:

  • 老张 :并发规则太保守,数据中台批量任务冲突率不到千分之一,行锁是多余开销,在concurrency.md加了批处理豁免条件。
  • 老周security.md缺SSRF防御,网关转发接口传个http://127.0.0.1:8080/actuator就能打穿内网,加了host白名单和私有IP过滤。
  • 小何null-safety.md漏了MQ心跳包场景------eventType字段90%有值,心跳包时为空,他线上炸过两次,用Optional.ofNullable()兜住。

当天晚上把三个人的补充合进GitHub仓库,建了team-code-review/目录。结构不变,还是五关,但每条规则后面标了来源:

markdown 复制代码
## 批量RPC分批复核
- 规则: 批量RPC调用超过50条时,必须分批并记录checkpoint
- 来源: 老张, 2026-06-18
- 触发: 数据同步接口1000条批次RPC超时,全批次失败

区分规则来源很重要------规则打架时,知道找谁聊。

加载机制不用额外配置:个人Skill放 ~/.claude/skills/(跟着人走),团队Skill放项目根目录 .claude/skills/(跟着仓库走)。Claude Code两个位置都会扫,所以每个人的AI天然同时加载两套规则。

四步PR流程(自然演化,不是设计出来的)

跑了两周之后,整个流程自己定了型:

复制代码
┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ 写代码    │ → │ PR前自查  │ → │ AI扫描   │ → │ 人工CR   │
│ 个人Skill │    │ 作者AI审查│    │ reviewer │    │ 只看架构  │
│ 团队Skill │    │ 全量扫描  │    │ AI审查   │    │ 和决策    │
└──────────┘    └──────────┘    └──────────┘    └──────────┘

先交代胶水层:AI 怎么自动评论 PR

Claude Code 自己不会在 PR 上发评论,开头场景靠的是一层 GitHub Actions 胶水:PR 一提交,CI 就触发 headless 模式扫描 diff,输出格式化成评论。

yaml 复制代码
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - name: AI 扫描 diff
        env: { ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} }
        run: |
          git diff origin/${{ github.base_ref }}...HEAD > pr.diff
          claude "加载 team-code-review 规则审查 pr.diff,按'第X条规则触发,建议查看'格式输出" > review.md
      - name: 发布到 PR 评论
        env: { GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} }
        run: gh pr comment ${{ github.event.number }} --body-file review.md

关键三点:pull_request 事件触发、无交互模式扫 diff、gh pr comment 回写结果,reviewer 侧 AI 自动回复也是同一套。胶水不值钱,值钱的是它让"AI 审 AI"从手动操作变成了默认流程------落地时记得加一层保险,只让 CI 回应非机器人账号的评论,否则两个 AI 会互相回复到账单爆炸。

第一步:写代码阶段

每个开发者的AI同时加载个人Skill和团队Skill。生成代码时就避开已知坑。效果类似于新员工入职第一天背熟了全组的事故报告。

第二步:PR前自查

提交PR之前,作者侧AI对diff做全量扫描。违反规则的地方自动标注,能自动修的就修,修不了的标注[人工判断]。这一步的意义不在于"问题都能自动修"------修不了的是大多数------而在于让作者在别人看到代码之前,先知道自己违反了自己写的哪条规则

第三步:reviewer侧AI扫描

reviewer的AI加载团队Skill,对diff再做一次全量扫描。输出格式不写"这里不好",而是"第X条规则触发,建议查看":

markdown 复制代码
## AI Review Summary
- ✅ 第一关(需求评审):已确认并发模型、上游输入、失败语义
- ✅ 第二关(并发安全):设备阈值更新使用行锁,通过
- ⚠️ 第三关(事务边界):见下方评论
- ✅ 第四关(空指针):外部输入已判空
- ✅ 第五关(安全检查):无SQL注入/SSRF/越权风险
- ⚠️ 规则冲突:与老张两周前加的 `team-code-review/concurrency.md` 第2条冲突,批量RPC未记录checkpoint

### 第三关详情
文件: DeviceSyncService.java:42
规则: transaction.md 第3条 --- 外部调用必须在事务提交后执行
问题: `ruleEngineClient.refresh(deviceId)` 在 @Transactional 方法体内
建议: 移入 afterCommit 回调或独立于事务生命周期

第四步:人工CR

审查者只看两样东西:AI标出来的问题,以及AI没标但涉及架构决策的部分。不再在"判空、加锁、格式"上花时间。

源码地址

五关审查Skill和团队协作模板已公开在 GitHub:wangheng19901021/skills

目录分两层:code-review-gate/ 是个人五关审查 Skill(SKILL.md + references/ + examples/),team-code-review/ 是团队级规则扩展,每个人往里加自己的坑。fork 一份,按自己团队的踩坑记录往里面加规则即可。

核心案例:老张自己加的规则,把自己审了

老张写了一个数据同步接口:从MySQL读设备,每100条调一次RPC推送到规则引擎。代码清晰,自己的AI过了------RPC在afterCommit里,transaction.md没问题。

我的AI审的时候引用了规则:

批量RPC调用超过50条时,必须做分批和失败重试,不能在一个事务里打穿整个批次。------老张,2026-06-18

老张加这条规则是因为上个月线上炸过------1000条批次RPC超时导致全批次失败。排查完当天加进去的。

他自己的AI回复:"本批次每100条一个子事务,RPC失败不影响已提交子批次。规则已满足。"

我的AI再次回复:"子事务间无checkpoint。第9个子批次失败→前8个已提交不可回滚→数据部分同步→无法确定断点续传。建议加checkpoint记录。每个子批次起始处写一条到本地事件表。"

老张最后加了checkpoint------不是AI替他写的方案,是他自己根据引子改的,但没有两条规则打架,这段隐患大概率会带着上线。注意:checkpoint 写在 push(batch) 之后,意味着消费端必须幂等,否则进程崩在中间会重复推送,这条已补进团队规则。

错误写法(老张最初版本):

java 复制代码
// 危险:没有 checkpoint,第9个子批次失败时前8个已提交,无法续传
for (int i = 0; i < devices.size(); i += 100) {
    List<Device> batch = devices.subList(i, Math.min(i + 100, devices.size()));
    ruleEngineClient.push(batch);
}

正确写法(审后版本):

java 复制代码
// 每个子批次成功后写 checkpoint,失败可从最近点恢复
for (int i = 0; i < devices.size(); i += 100) {
    List<Device> batch = devices.subList(i, Math.min(i + 100, devices.size()));
    ruleEngineClient.push(batch);
    checkpointService.save("device_sync", i + batch.size());
}

这个案例的核心不是"AI发现了bug"。是老张一个月前定义的规则,拦住了他一个月后写出的代码。 规则面前,人和AI平等。

代码层面:什么变了,什么没变

变了的三件事

1. PR低价值评论清零。

"这里判null""那里加锁""大括号换行"------这些评论不需要人写了。AI在生成代码时就处理了变量命名、判空、格式化;PR扫描时再兜底一次。人的注意力从"纠错"释放出来。

2. 经验传递路径缩短。

以前:踩坑 → 复盘 → 分享 → 别人记住 → 下次想起来(每个环节都可能断)。

现在:踩坑 → 写一条规则到团队Skill → 所有人的AI自动检查。

小何三年经验的MQ心跳坑,老周十年的SSRF坑,互相保护。三年帮十年,十年帮三年。

3. CR对话从"对不对"变成"好不好"。

真实PR评论摘录:

这个接口QPS预期5000,乐观锁重试三次对数据库QPS影响大概15%,可接受。但重试率超过8%的话建议拆到Redis做,改造量约两天,单独排需求。

------老周,审我的代码时写的。这段话AI写不出来。但让他有精力写出这段话的前提是:AI已经替他审完了所有该审的代码。

没变的三件事

AI能做的 AI不能做的
检查规则是否违反 判断这个功能该不该做
指出规则间冲突 评估改动在当前上下文里的连锁代价
标注风险等级 决定什么时候该违反规则

上周一个紧急需求需要绕过正常流程直接写库。AI标了三条警告,我们点了"手动忽略"。只要还能手动忽略,底线就在人手里。

团队Skill的维护:踩一个坑,加一条规则

维护方式极简:

markdown 复制代码
1. 线上炸了 → 排查
2. 排查完 → 确认根因是不是Skill现有规则能兜住的
3. 不能→在对应reference文件里加一条,标注来源和日期
4. git commit + push → 所有人的AI下次自动生效

不靠Confluence,不靠周会分享,不靠"下次注意"。靠AI每次都读。

注意:新规则 push 后,已启动的 Claude Code 会话可能需要重启或手动刷新 Skill 缓存,才能在当前对话里生效。

总结:Skill = 团队的集体记忆

一个人踩坑自己扛,是常态。一个人把坑写进团队规则,所有人的AI从此避开------这才叫团队。

Skill不是辅助工具,是集体记忆。 不是帮你写代码,是帮你的团队记住所有不该再犯的错。

五关审查Skill公开在 wangheng19901021/skills。你们团队fork一份,按自己的踩坑记录慢慢养。

觉得这套团队协作思路有用,先收藏,拉团队一起落地时能直接对着抄。关注我,下一篇聊紧急需求下AI标了三条警告、我们点了"手动忽略"------"手动忽略"的边界到底该怎么定。


不发教程,只发踩坑记录。十年Java老兵,用代码说话。

相关推荐
长栎17 小时前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
后端
外滩运维专家17 小时前
Let's Encrypt 的 ACME 协议到底干了什么?用抓包带你看一遍
后端
程序员多吃鸭eatmoreduck18 小时前
# 开源初体验,39 天 800 Star:我把项目发到了哪里,流量到底从哪来
后端
雪隐18 小时前
个人电脑玩AI-10让5060 Ti给你打工——我让 Claude Code 喝上了本地杂粮:Ternary-Bonsai-27B 部署历险记
前端·人工智能·后端
云上小朱18 小时前
Intel SGX相关软件部署
后端
码农学院18 小时前
建筑机械行业AI搜索优化技术方案:基于Spring Cloud微服务架构的文件管理与智能化内容推荐系统
人工智能·spring cloud·架构
Reart18 小时前
Leetcode 1143.最长公共子序列(720)
后端·算法
掘金者阿豪18 小时前
一条SQL能执行成功,不代表它真的安全:一次生产环境数据库迁移事故复盘
后端