多维度质量审查,带质量门控。每个变更在合并前都要审查 — 没有例外。
审查覆盖五个轴: 正确性、可读性、架构、安全、性能。
批准标准: 当变更明确改善了整体质量时就批准,即使不完美。完美代码不存在 — 目标是持续改进。不要因为变更不完全是你会写的方式就阻塞。如果它改善了代码库并遵循了项目约定,批准它。
代码/方案是否做了它声称要做的事?
另一个工程师(或Agent)能否在不靠作者解释的情况下理解?
temp、 data、 result)// removed 注释?变更是否适合系统的设计?
4a. 代码安全(传统检查项):
4b. Agent Skill 供应链安全(v1.1.0 新增,源自 NVIDIA SkillSpector 16 类漏洞模式):
背景:42,447 个公开技能中 26.1% 含漏洞、5.2% 含恶意意图(Liu et al., 2026)
检查维度关键风险快速验证提示注入(5种)指令覆盖、隐藏指令、有害内容检查 markdown 注释/隐藏 HTML/零宽字符数据外泄(4种)发送 env vars/文件到外部服务器grep fetch/ http/ curl + 检查目标URL特权升级(3种)sudo/root/cron 持久化grep sudo/ chmod 777/ cron/ systemctl供应链(6种)未锁定依赖、 curl|bash、混淆代码检查 unpinned deps / Base64 / eval()过度代理(4种)不受限工具访问、自主高影响决策审查工具白名单是否有 * 通配符系统提示泄漏(3种)直接/间接提取系统指令检查输出是否可能包含内部 prompt记忆投毒(3种)持久上下文注入、窗口填充检查是否写入 MEMORY/references 无验证MCP 权限(4种)声明权限 > 实际使用(或反之)对比 manifest vs 实际工具调用MCP 工具投毒(4种)Unicode 同形字、隐藏 HTML 注释检查工具描述的不可见字符流氓代理(2种)自我修改、未授权持久化检查自修改代码 + cron/startup
4c. CI/CD 管线安全(v1.2.0 新增,源自 OpenAI Axios 供应链攻击事件 2026-03):
背景:攻击者入侵 Axios 维护者账号,注入恶意代码到 v1.14.1,通过 GitHub Actions 泄露 OpenAI 签名证书
@v1/ @main)?actions/*、 github/*、 docker/*)?npm owner/ pip maintainer diff)?GITHUB_TOKEN/ NPM_TOKEN 权限范围是否最小化(read-only 优先)?4d. 声明-行为完整性验证 BIV(v1.3.0 新增,源自 Palo Alto Unit 42 "Trust No Skill" 研究 2026-06):
背景:对 49,916 个公开技能的审计发现 80%(39,933 个)存在声明与行为偏差,137 个偏差分类,4 种复合威胁模式
核心方法:三面对比审计(Metadata vs Executable vs Natural-language)
SKILL.md 声明 vs 代码行为:技能描述声称的能力是否与代码实际功能匹配?
Manifest 权限 vs 实际调用:YAML manifest 声明的工具权限是否与实际代码调用一致?
read_file 但代码调用了 bash/ fetch/ subprocess?复合威胁链检测:单个能力看起来无害,但组合后形成攻击链?
FILE_READ → base64 编码 → NETWORK_SEND(数据外泄链)ENV_READ → HTTP_POST → 外部服务器(凭证窃取链)PROMPT_INJECT → MEMORY_WRITE → 持久上下文投毒(记忆投毒链)TOOL_CALL → OUTPUT_EXFIL → SELF_REPLICATE(自我复制链)BIV 快速命令参考:
bash
# 1. 提取技能声明的能力关键词
grep -i 'description\|capabilities\|features' SKILL.md
# 2. 提取代码实际的能力关键词
grep -rn 'fetch\|http\|exec\|eval\|spawn\|writeFile\|deleteFile\|network' scripts/
# 3. 对比:声明中没有但代码中存在的能力 → 偏差标记
# 4. 复合链:检查是否存在 READ→ENCODE→SEND 模式
grep -rn 'readFile\|readFileSync\|readdir' scripts/ | grep -l 'base64\|btoa\|Buffer.from'
偏差严重度分级:
级别含义示例Benign文档不完善,功能无害描述遗漏了一个次要功能Suspicious偏差需要解释声明"本地处理"但有网络调用(可能是日志)Malicious明确的欺骗行为声明"无网络"但实际发送凭证到外部
4e. MCP Server 安全审计(v1.4.0 新增,源自 2026-06 MCP 生态爆发 + Akamai KYA 信任框架):
背景:2026年6月一周内 Azure App Service / Oracle Essbase / IBM watsonx / AWS DevOps Agent / MDN 等 5+ 企业级 MCP Server 发布,MCP 正成为 Agent 工具调用的事实标准协议。MCP Server 暴露 REST API 为 AI 可调用工具,其安全风险不同于传统 API——AI Agent 自主决策调用,无人类逐次审批。
MCP Server 安全检查清单:
检查维度关键风险快速验证认证与授权OAuth 2.1 配置是否正确?PKCE 是否强制?检查 /.well-known/oauth-authorization-server 端点工具权限分级是否实现 viewer/analyst/admin 三级权限?默认是否只读?检查启动参数默认 profile,grep viewer|analyst|admin凭证保护错误响应是否脱敏?是否泄露密码/token/路径?构造错误请求,检查 error response 内容破坏性操作确认delete/update 操作是否要求 confirm 参数?检查 mutating tools 是否有 confirm 参数要求输出边界查询结果是否有 max_rows 限制?是否防止 token 爆炸?检查 max_rows/ limit/ output_bound 配置传输安全stdio vs streamable-http 选择是否合理?HTTP 是否强制 TLS?检查 --transport 默认值,非 loopback 绑定是否要求 auth token网络隔离非 loopback 绑定是否有默认保护?检查 bind address 默认值和 MCP_AUTH_TOKEN 要求审计日志所有 mutating 操作是否有审计记录?检查 INFO/WARN 级别日志是否覆盖 tool 调用工具目录治理是否有 YAML policy 定义工具拦截规则?启动时是否扫描不安全工具?检查 AgentGovernance 配置和 startup scanOpenAPI 映射安全从 OpenAPI spec 自动生成 MCP 工具时,是否审查了每个 operation 的副作用?对比 OpenAPI spec 中 POST/PUT/DELETE 操作与生成的 MCP 工具
MCP Server 审计快速命令:
bash
# 1. 认证检查:是否要求 auth token
grep -rn 'auth\|token\|oauth\|pkce\|credential' server.py main.py app.py
# 2. 权限分级:默认 profile 是否为 viewer
grep -rn 'profile\|viewer\|admin\|read.only\|default.*mode' *.py *.ts *.js
# 3. 破坏性操作确认
grep -rn 'confirm\|destructive\|delete\|drop\|truncate' tools/ handlers/
# 4. 输出边界
grep -rn 'max_rows\|limit\|output_bound\|page_size\|cap' *.py *.ts
# 5. 网络绑定安全
grep -rn 'bind\|host\|0\.0\.0\.0\|loopback\|127\.0\.0\.1' *.py *.ts *.js
# 6. 凭证脱敏
grep -rn 'redact\|mask\|sanitize\|scrub' errors/ middleware/ utils/
# 7. 审计日志
grep -rn 'audit\|log.*tool\|log.*mutation\|info.*call' *.py *.ts
MCP Server 安全评级:
评级条件建议A默认只读 + 凭证脱敏 + 破坏性确认 + 审计日志 + 输出边界可部署到生产B缺少 1-2 项但无 Critical 缺陷补充后部署C默认非只读 或 无认证 或 凭证可能泄露修复后重新审计F无认证 + 无权限分级 + 无输出边界拒绝部署
变更是否引入了性能问题?
小的、聚焦的变更更容易审查、更快合并、更安全部署。
text
~100 行变更 → 好。一次审查完成。
~300 行变更 → 可接受,如果是单个逻辑变更。
~1000 行变更 → 太大。拆分。
什么时候算"一个变更": 一个自包含的修改,解决一件事,包含相关测试,提交后系统保持功能完整。是功能的一部分 — 不是整个功能。
拆分策略:
策略方法适用场景堆叠提交一个小变更,基于它开始下一个顺序依赖按文件组为需要不同审查者的文件组分开变更跨领域关注水平先创建共享代码/stub,再创建消费者分层架构垂直分解为更小的全栈功能切片功能开发
大变更可接受的场景: 完整文件删除和自动化重构(审查者只需验证意图,不需要逐行审查)。
将重构与功能开发分开。 既重构又添加新行为的变更是两个变更 — 分开提交。
在看代码之前,理解意图:
测试揭示意图和覆盖范围:
带着五个轴遍历代码:
对每个变更的文件:
为每个评审意见标记严重级别,让作者知道什么是必须的 vs 可选的:
前缀含义作者行动Critical:阻塞合并安全漏洞、数据丢失、功能破坏Important:需要修复合并前必须处理Nit:次要、可选作者可以忽略 — 格式、风格偏好Optional: / Consider:建议值得考虑但不必须FYI仅供参考不需要行动 — 为未来参考的上下文
这防止作者把所有反馈都当作必须的而在可选建议上浪费时间。
检查作者的验证故事:
安装任何 Agent Skill 或部署任何 MCP Server 前执行此快速审计(≤3分钟):
Phase A: 静态扫描(原有)
exec/ eval/ subprocess/ __import__.js/ .py/ .sh 中的外部URL,标记非已知域名* 版本)或 curl | bashcron/ systemctl/ .bashrc/ startup/ schedulePhase B: BIV 声明-行为完整性验证(v1.3.0 新增)
6. 三面对比:SKILL.md 描述 vs manifest 权限 vs 代码实际行为 → 标记偏差
7. 复合链检测:检查是否存在 READ→ENCODE→SEND / ENV→HTTP / INJECT→MEMORY→PERSIST 模式
8. 偏差评级:每个偏差标记 Benign/Suspicious/Malicious
Phase C: MCP Server 安全审计(v1.4.0 新增,仅 MCP Server 部署时执行)
9. 认证检查:确认 OAuth 2.1/PKCE/Access Token 配置正确
10. 默认权限:确认默认为 viewer(只读)模式
11. 凭证脱敏:构造错误请求验证 error response 不含密码/token/路径
12. 破坏性确认:确认 delete 类工具要求 confirm 参数
13. 输出边界:确认查询结果有 max_rows 限制
14. 网络绑定:确认非 loopback 绑定要求 MCP_AUTH_TOKEN
15. MCP 安全评级:按 4e 评级表给出 A/B/C/F 评级
判定规则:
MCP Server 判定规则(v1.4.0 新增):
快速命令参考:
bash
# 危险函数扫描
grep -rn 'exec\|eval\|subprocess\|__import__\|child_process' scripts/
# 外部网络调用
grep -rn 'fetch\|http\|https\|curl\|wget\|axios' scripts/
# 持久化行为
grep -rn 'cron\|systemctl\|bashrc\|startup\|schedule' .
# BIV: 复合威胁链检测
grep -rl 'readFile\|readFileSync\|open(' scripts/ | xargs grep -l 'base64\|btoa\|Buffer.from'
grep -rl 'process.env\|os.environ' scripts/ | xargs grep -l 'fetch\|http\|post\|axios'
markdown
## Review: [变更标题]
### 上下文
- [ ] 我理解这个变更做什么、为什么
### 正确性
- [ ] 变更匹配规格/任务要求
- [ ] 边界情况已处理
- [ ] 错误路径已处理
- [ ] 测试充分覆盖变更
### 可读性
- [ ] 命名清晰一致
- [ ] 逻辑直接
- [ ] 无不必要的复杂性
### 架构
- [ ] 遵循现有模式
- [ ] 无不必要的耦合或依赖
- [ ] 适当的抽象级别
### 安全
- [ ] 代码中无密钥
- [ ] 边界处输入已验证
- [ ] 无注入漏洞
- [ ] 认证检查就位
### 性能
- [ ] 无 N+1 模式
- [ ] 无无界操作
- [ ] 列表端点有分页
### 验证
- [ ] 测试通过
- [ ] 构建成功
- [ ] 手动验证完成(如适用)
### 发现
| # | 发现 | 级别 | 轴 | 说明 |
|---|------|------|-----|------|
| 1 | ... | Critical/Important/Nit | ... | ... |
### 裁决
- [ ] **Approve** — 可以合并
- [ ] **Request changes** — 问题必须解决
当解决审查分歧时,应用此层级:
不要接受"我稍后清理。" 经验表明延迟清理很少发生。要求提交前清理。
借口现实"能用就行了"能用但不可读/不安全/架构错误的代码创造复利债务。"我写的,所以我知道是对的"作者对自己的假设视而不见。每个变更都受益于另一双眼睛。"稍后清理"稍后从不到来。审查是质量门控 — 使用它。"测试通过了所以没问题"测试是必要的但不充分。它们不捕获架构问题、安全问题或可读性问题。"变更太小不需要审查"小变更也可能引入安全漏洞或破坏边界情况。
审查完成后: