首页
/ ECC 的 Kiro code-reviewer Agent:置信度过滤、严重度分级与零发现即通过的 AI 代码评审方法

ECC 的 Kiro code-reviewer Agent:置信度过滤、严重度分级与零发现即通过的 AI 代码评审方法

2026-09-06 14:02:33作者:姚月梅Lane

本篇基于 ECC(Everything Claude Code)仓库中的 code-reviewer Agent 定义文件,完整解析这套面向 Kiro 环境的 AI 代码评审代理:它的工具边界、五步评审流程、置信度过滤与"零发现即通过"的降噪原则,以及按 CRITICAL/HIGH/MEDIUM/LOW 四级严重度组织的检查清单、结构化输出格式与审批判据。读完后你能够理解如何把一名"高级代码评审员"以纯 Markdown 提示词 + JSON 工具配置的形式固化进团队工作流,并可复制其中的评审清单直接用于自己的项目。

一、它是什么:一个以 Markdown 提示词定义的 Kiro Agent

.kiro/agents/code-reviewer.md 是 ECC 为 Kiro(.kiro 目录集成)提供的 33 个 Agent 之一。其 YAML frontmatter 声明了代理的身份契约:

---
name: code-reviewer
description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability.
  Use immediately after writing or modifying code. MUST BE USED for all code changes.
allowedTools:
  - read
  - shell
---

三个要点:

  • 角色定位:高级代码评审员(senior code reviewer),目标是保证代码质量与安全的"高标准";
  • 触发纪律:description 中用 "MUST BE USED for all code changes" 强制约定——写完或修改代码后必须立即使用,这是 ECC 推荐的"写码 → 评审 → 安全复查"链路中的一环(见 .kiro/README.md 中 Recommended Workflow 第 3 步 "Review your code: Switch to code-reviewer agent after writing code");
  • 最小工具面read(读文件)与 shell(执行 git diff 等只读类命令),Agent 只评审、不代改,避免评审者顺手"修代码"带来的二次风险。

同一代理在仓库中还有配套的 CLI 版本 code-reviewer.json,其结构从源码层面印证了 MD 版的工具约定:

{
  "name": "code-reviewer",
  "allowedTools": ["fs_read", "shell"],
  "mcpServers": {},
  "hooks": {},
  "prompt": "You are a senior code reviewer ensuring high standards of code quality and security.\n..."
}

从源码结构看,.json 中的 prompt 字段就是 .md 正文的逐字副本,仅工具名做了 Kiro CLI 的映射(readfs_read)。.kiro/README.md 也说明了两种格式并存的原因:Markdown 文件供 IDE 使用(自动选择或显式 /code-reviewer 调用),JSON 文件供 kiro-cli 使用(/agent swap 切换)。

二、五步评审流程:先取证,再下结论

文档开头给出的 Review Process 是整个 Agent 的骨架,原文五步如下(含全部原始命令):

  1. Gather context(收集上下文) — 先运行 git diff --stagedgit diff 查看全部变更;如果没有 diff,用 git log --oneline -5 回看最近提交;
  2. Understand scope(理解范围) — 识别改了哪些文件、对应什么功能/修复、文件之间如何关联;
  3. Read surrounding code(读周边代码) — 不孤立评审改动行:读完整文件,理解 imports、依赖与调用点;
  4. Apply review checklist(套用检查清单) — 按 CRITICAL → LOW 的顺序逐类过一遍下文清单;
  5. Report findings(报告发现) — 使用规定的输出格式,且只报告置信度 >80% 的确定问题

第 1 步与第 5 步分别锚定了流程的两端:入口是 git 取证,出口是置信度门槛。第 3 步则是整份文档反复强调的方法论——"Don't review changes in isolation",这与仓库中 review-mode.md 手动评审模式中的第 3 条 "Read surrounding code — Don't review in isolation" 完全同源,说明 ECC 把"带上下文的评审"当作跨 Agent、跨 steering 文件的统一规范。

三、置信度过滤:防噪是这套评审体系的灵魂

文档用独立章节 "Confidence-Based Filtering" 明确了五条过滤规则(原文逐条继承):

  • Report:仅当对某问题 >80% 确信时报告;
  • Skip:风格偏好一律跳过,除非它违反了项目既有约定;
  • Skip:未变更代码中的问题跳过,唯一的例外是 CRITICAL 级安全问题;
  • Consolidate:同类问题合并陈述(例如报"5 个函数缺失错误处理",而不是列 5 条);
  • Prioritize:优先报告可能引发 bug、安全漏洞或数据丢失的问题。

这套规则直接针对 LLM 评审者最典型的失效模式——用噪声淹没评审人。配套的自动触发机制也遵循同一精神:code-review-on-write.kiro.hook 在每次文件写入后(postToolUse + toolTypes: ["write"])让 Agent 做快速检查,提示词末尾明确写着 "Only comment if you find issues worth addressing"——没有值得说的问题就闭嘴。

配套的自动钩子:评审在写入瞬间发生

该 hook 的完整配置如下,展示了 Agent 之外的自动化层如何与 code-reviewer 形成双层防线:

{
  "name": "code-review-on-write",
  "version": "1.0.0",
  "enabled": true,
  "description": "Performs a quick code review after write operations to catch common issues",
  "when": { "type": "postToolUse", "toolTypes": ["write"] },
  "then": {
    "type": "askAgent",
    "prompt": "Code was just written or modified. Perform a quick review checking for: 1) Common security issues (SQL injection, XSS, etc.), 2) Error handling, 3) Code clarity and maintainability, 4) Potential bugs or edge cases. Only comment if you find issues worth addressing."
  }
}

从源码结构看,hook 只做"轻量快扫"(安全常见项、错误处理、可读性、边界情况),而 code-reviewer Agent 负责 diff 级的完整评审——ECC 用触发粒度区分了两种评审强度。.kiro/README.md 的 Recommended Workflow 进一步把链路排成:planner 规划 → tdd-workflow 先写测试 → code-reviewer 评审 → security-reviewer 安全复查 → quality-gate 提交前把关。

四、分级检查清单:从 CRITICAL 安全项到 LOW 风格项

清单共六个类别,严重度递减排列。以下完整继承各条目并补充代码示例。

4.1 安全(CRITICAL):必须标记,因为它们"能造成真实损害"

  • 硬编码凭据 — API key、密码、token、连接串出现在源码中;
  • SQL 注入 — 用字符串拼接构造查询,而非参数化查询;
  • XSS — 未转义的用户输入被渲染进 HTML/JSX;
  • 路径穿越 — 用户可控的文件路径未做净化;
  • CSRF — 状态变更端点缺少 CSRF 防护;
  • 认证绕过 — 受保护路由缺失鉴权检查;
  • 不安全依赖 — 已知存在漏洞的包;
  • 日志泄露机密 — 把 token、密码、PII 写入日志。

文档给出的 SQL 注入对照示例:

// BAD: SQL 注入 —— 字符串拼接
const query = `SELECT * FROM users WHERE id = ${userId}`;

// GOOD: 参数化查询
const query = `SELECT * FROM users WHERE id = $1`;
const result = await db.query(query, [userId]);

XSS 示例则强调对用户内容必须走 DOMPurify.sanitize() 或等价净化:

// BAD: 直接渲染用户 HTML 而未净化

// GOOD: 使用文本内容或先净化
<div>{userComment}</div>

4.2 代码质量(HIGH):带量化阈值的结构性问题

  • 函数过长(>50 行)— 拆分为小函数;
  • 文件过大(>800 行)— 按职责抽模块;
  • 嵌套过深(>4 层)— 用提前返回、抽辅助函数压平;
  • 缺失错误处理 — 未处理的 promise rejection、空 catch 块;
  • 可变(mutation)写法 — 优先不可变操作(spread、map、filter);
  • console.log 残留 — 合并前删除调试日志;
  • 新代码路径缺测试;
  • 死代码 — 注释掉的代码、未用 import、不可达分支。

文档配了一组"深嵌套 + 原地修改" vs "提前返回 + 不可变"的对照:

// BAD: Deep nesting + mutation
function processUsers(users) {
  if (users) {
    for (const user of users) {
      if (user.active) {
        if (user.email) {
          user.verified = true;  // mutation!
          results.push(user);
        }
      }
    }
  }
  return results;
}

// GOOD: Early returns + immutability + flat
function processUsers(users) {
  if (!users) return [];
  return users
    .filter(user => user.active && user.email)
    .map(user => ({ ...user, verified: true }));
}

值得注意的是 50 行/800 行这两个阈值在仓库多处复用:commands/code-review.md 的本地评审模式(Local Review Mode)同样列出 "Functions > 50 lines / Files > 800 lines / Nesting depth > 4 levels",说明这是 ECC 跨 Claude Code 与 Kiro 两套 harness 的统一质量红线。

4.3 React/Next.js 模式(HIGH)

审查 React/Next.js 代码时额外检查:

  • 依赖数组缺失useEffect/useMemo/useCallback 的 deps 不完整;
  • 渲染期 setState — 会引发无限循环;
  • 列表 key 缺失 — 可重排序的列表用数组索引当 key;
  • Props 深钻 — 跨 3 层以上传 props(应使用 context 或组合);
  • 不必要的重渲染 — 昂贵计算缺 memoization;
  • 客户端/服务端边界 — 在 Server Components 里用 useState/useEffect
  • 缺 loading/error 态 — 数据请求没有兜底 UI;
  • 陈旧闭包 — 事件处理器捕获过期 state。

两个对照示例:

// BAD: 依赖缺失 + 陈旧闭包
useEffect(() => {
  fetchData(userId);
}, []); // userId 未列入 deps

// GOOD: 依赖完整
useEffect(() => {
  fetchData(userId);
}, [userId]);
// BAD: 可重排列表用索引作 key
{items.map((item, i) => <ListItem key={i} item={item} />)}

// GOOD: 稳定的唯一 key
{items.map(item => <ListItem key={item.id} item={item} />)}

4.4 Node.js/后端模式(HIGH)

  • 未校验输入 — 请求 body/params 未经 schema 校验即使用;
  • 缺限流 — 公开端点没有节流;
  • 无界查询 — 面向用户的端点使用 SELECT * 或无 LIMIT 的查询;
  • N+1 查询 — 循环里逐条取关联数据,而不是 join/批量;
  • 缺超时 — 外部 HTTP 调用未配置超时;
  • 错误信息泄露 — 把内部错误细节发给客户端;
  • 缺 CORS 配置 — API 对非预期来源可访问。

N+1 的 BAD/GOOD 示例:

// BAD: N+1 查询
const users = await db.query('SELECT * FROM users');
for (const user of users) {
  user.posts = await db.query('SELECT * FROM posts WHERE user_id = $1', [user.id]);
}

// GOOD: 单条 JOIN 或批量查询
const usersWithPosts = await db.query(`
  SELECT u.*, json_agg(p.*) as posts
  FROM users u
  LEFT JOIN posts p ON p.user_id = u.id
  GROUP BY u.id
`);

4.5 性能(MEDIUM)与最佳实践(LOW)

性能类:低效算法(O(n²) 本可 O(n log n) 或 O(n))、缺 React.memo/useMemo/useCallback、整库引入导致 bundle 过大、昂贵计算重复执行无缓存、大图未压缩或未懒加载、异步上下文中的同步 I/O。

最佳实践类:TODO/FIXME 不带 issue 号、公共 API 缺 JSDoc、非平凡上下文中的单字母命名(x、tmp、data)、无解释的魔法数字、格式不一致(分号/引号/缩进混用)。

五、结构化输出:让评审结果可被机器与人都消费

单条发现的格式

[CRITICAL] Hardcoded API key in source
File: src/api/client.ts:42
Issue: API key "sk-abc..." exposed in source code. This will be committed to git history.
Fix: Move to environment variable and add to .gitignore/.env.example

  const apiKey = "sk-abc123";           // BAD
  const apiKey = process.env.API_KEY;   // GOOD

每条发现固定四要素:严重度标签 + 标题、文件与行号、问题描述、修复建议(附 BAD/GOOD 代码对照)。

收尾摘要表

每份评审必须以这样的 Summary 结尾:

## Review Summary

| Severity | Count | Status |
|----------|-------|--------|
| CRITICAL | 0     | pass   |
| HIGH     | 2     | warn   |
| MEDIUM   | 3     | info   |
| LOW      | 1     | note   |

Verdict: WARNING — 2 HIGH issues should be resolved before merge.

审批判据(Approval Criteria)

  • Approve:无 CRITICAL 也无 HIGH;
  • Warning:只有 HIGH(可谨慎合并);
  • Block:出现 CRITICAL — 合并前必须修复。

这套三级判据与 commands/code-review.md PR 评审模式的 Phase 5 决策表(APPROVE / REQUEST CHANGES / BLOCK)语义一致,表明 ECC 在不同 harness 间保持了"同一严重度 → 同一合并动作"的稳定契约。

六、项目适配层:评审标准跟随仓库约定

"Project-Specific Guidelines" 一节要求 Agent 在可用时读取 CLAUDE.md 或项目规则文件,把评审基线切换到项目自己的约定:

  • 文件大小限制(典型 200-400 行、上限 800 行);
  • Emoji 策略(许多项目禁止代码中出现 emoji);
  • 不可变性要求(spread 优于 mutation);
  • 数据库策略(RLS、迁移模式);
  • 错误处理模式(自定义错误类、error boundary);
  • 状态管理约定(Zustand、Redux、Context)。

收尾原则值得单独强调:"Adapt your review to the project's established patterns. When in doubt, match what the rest of the codebase does." 即拿不准时以现有代码库的做法为准。这防止了 Agent 用一个"教科书标准"去否决一个项目自洽但不同的既有风格。在 Kiro 侧,这类约定由 auto 加载的 steering 文件承载(如 coding-style、security、testing,见 .kiro/README.md Steering Files 表),Agent 与 steering 文件共同构成"项目级评审基线"。

七、v1.8 附录:评审 AI 生成代码的专项优先级

文档最后一段是 "v1.8 AI-Generated Code Review Addendum",针对评审对象本身是 AI 生成变更的场景给出优先级排序:

  1. 行为回归与边界情况处理;
  2. 安全假设与信任边界;
  3. 隐藏耦合或无意的架构漂移;
  4. 不必要的、由模型成本驱动的复杂度。

并附一条成本感知检查(Cost-awareness check):

  • 标记那些在没有明确推理需求的情况下升级到更高成本模型的工作流;
  • 对确定性的重构,建议默认走低成本档位。

这一段揭示了 ECC 的元认知:评审 Agent 不只盯代码,还盯"生成这段代码的 Agent 工作流是否过度消耗模型资源"——这与项目自我描述"agent harness performance optimization system"的定位一致。

八、在 Kiro 中安装与调用 code-reviewer

结合 .kiro/README.md 的 Quick Start,完整落地路径如下:

# 进入 ECC 仓库的 .kiro 目录
cd .kiro

# 安装到指定项目(非破坏性拷贝,不会覆盖已有文件)
./install.sh /path/to/your/project

# 或安装到当前目录 / 全局(~)
./install.sh
./install.sh ~

安装后有两种调用方式:

  • IDE:会话中输入 /code-reviewer,或由 Kiro 自动选择;
  • CLIkiro-cli --agent code-reviewer 直接以该代理启动,或在会话中 /agent swap code-reviewer 切换。README 给出的典型序列是:实现完成后 /agent swap code-reviewer,再输入 "Review the authentication implementation",随后按需切换到 security-reviewer 做安全深查、触发 quality-gate hook 做提交前全量检查。

需要说明的适用前提(均来自文档原文):Agent 的实际模型由 Kiro 当前模型选择决定,不由 Agent 配置决定;安装器采用非破坏性拷贝,重复安装不会覆盖你的定制修改。

九、小结:把"资深评审员"固化为可复用资产

回到 code-reviewer.md 的设计本身,它的价值密度集中在四个可迁移的机制上:

  1. 工具最小化 — read + shell 双工具,评审与修改分离;
  2. 置信度过滤 + 零发现合法化 — >80% 门槛、同类合并、"零条发现并给出 APPROVE"是预期结果而非失职;
  3. 量化清单 — 50 行/800 行/4 层嵌套等硬阈值 + BAD/GOOD 成对示例,让每次评审的判定可复现;
  4. 项目适配优先 — 拿不准时对齐代码库现状,而非强行套用外部标准。

再叠加写入后自动快扫的 code-review-on-write 钩子、手动 #review-mode 上下文(review-mode.md)以及提交前的 quality-gate 钩子,ECC 在 Kiro 环境中形成了一条"即时快扫 → diff 级全量评审 → 门禁验证"的三层评审管线。如果你想在自己的项目复刻这套能力,最短路径是:以本文为蓝本保留其检查清单与输出格式,把"项目适配"一节替换为你自己的约定文件,并同样坚持"零发现也是有效评审"这条纪律——它是整份文档里最能抑制 LLM 评审噪声的一行话。

登录后查看全文
热门项目推荐
相关项目推荐