Install
openclaw skills install qqyougit-code-review-and-quality多维度质量审查,覆盖五轴(正确性/可读性/架构/安全/性能)+ Agent Skill安全审计(NVIDIA SkillSpector 16类漏洞模式 + Palo Alto BIV声明-行为完整性验证)。 26%的Agent技能含漏洞,5.2%含恶意代码,80%存在声明与行为偏差——安全轴升级为七维:代码安全+Skill供应链+MCP权限+提示注入+数据外泄+特权升级+BIV完整性。 触发:合并PR前、Skill安装前、功能实现后、重构后、bug修复后、方案提交前。
openclaw skills install qqyougit-code-review-and-quality多维度质量审查,带质量门控。每个变更在合并前都要审查 — 没有例外。
审查覆盖五个轴:正确性、可读性、架构、安全、性能。
批准标准: 当变更明确改善了整体质量时就批准,即使不完美。完美代码不存在 — 目标是持续改进。不要因为变更不完全是你会写的方式就阻塞。如果它改善了代码库并遵循了项目约定,批准它。
代码/方案是否做了它声称要做的事?
另一个工程师(或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)
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 快速命令参考:
# 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 | 明确的欺骗行为 | 声明"无网络"但实际发送凭证到外部 |
变更是否引入了性能问题?
小的、聚焦的变更更容易审查、更快合并、更安全部署。
~100 行变更 → 好。一次审查完成。
~300 行变更 → 可接受,如果是单个逻辑变更。
~1000 行变更 → 太大。拆分。
什么时候算"一个变更": 一个自包含的修改,解决一件事,包含相关测试,提交后系统保持功能完整。是功能的一部分 — 不是整个功能。
拆分策略:
| 策略 | 方法 | 适用场景 |
|---|---|---|
| 堆叠 | 提交一个小变更,基于它开始下一个 | 顺序依赖 |
| 按文件组 | 为需要不同审查者的文件组分开变更 | 跨领域关注 |
| 水平 | 先创建共享代码/stub,再创建消费者 | 分层架构 |
| 垂直 | 分解为更小的全栈功能切片 | 功能开发 |
大变更可接受的场景: 完整文件删除和自动化重构(审查者只需验证意图,不需要逐行审查)。
将重构与功能开发分开。 既重构又添加新行为的变更是两个变更 — 分开提交。
在看代码之前,理解意图:
测试揭示意图和覆盖范围:
带着五个轴遍历代码:
对每个变更的文件:
为每个评审意见标记严重级别,让作者知道什么是必须的 vs 可选的:
| 前缀 | 含义 | 作者行动 |
|---|---|---|
| Critical: | 阻塞合并 | 安全漏洞、数据丢失、功能破坏 |
| Important: | 需要修复 | 合并前必须处理 |
| Nit: | 次要、可选 | 作者可以忽略 — 格式、风格偏好 |
| Optional: / Consider: | 建议 | 值得考虑但不必须 |
| FYI | 仅供参考 | 不需要行动 — 为未来参考的上下文 |
这防止作者把所有反馈都当作必须的而在可选建议上浪费时间。
检查作者的验证故事:
安装任何 Agent Skill 前执行此快速审计(≤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
判定规则:
快速命令参考:
# 危险函数扫描
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'
## Review: [变更标题]
### 上下文
- [ ] 我理解这个变更做什么、为什么
### 正确性
- [ ] 变更匹配规格/任务要求
- [ ] 边界情况已处理
- [ ] 错误路径已处理
- [ ] 测试充分覆盖变更
### 可读性
- [ ] 命名清晰一致
- [ ] 逻辑直接
- [ ] 无不必要的复杂性
### 架构
- [ ] 遵循现有模式
- [ ] 无不必要的耦合或依赖
- [ ] 适当的抽象级别
### 安全
- [ ] 代码中无密钥
- [ ] 边界处输入已验证
- [ ] 无注入漏洞
- [ ] 认证检查就位
### 性能
- [ ] 无 N+1 模式
- [ ] 无无界操作
- [ ] 列表端点有分页
### 验证
- [ ] 测试通过
- [ ] 构建成功
- [ ] 手动验证完成(如适用)
### 发现
| # | 发现 | 级别 | 轴 | 说明 |
|---|------|------|-----|------|
| 1 | ... | Critical/Important/Nit | ... | ... |
### 裁决
- [ ] **Approve** — 可以合并
- [ ] **Request changes** — 问题必须解决
当解决审查分歧时,应用此层级:
不要接受"我稍后清理。" 经验表明延迟清理很少发生。要求提交前清理。
| 借口 | 现实 |
|---|---|
| "能用就行了" | 能用但不可读/不安全/架构错误的代码创造复利债务。 |
| "我写的,所以我知道是对的" | 作者对自己的假设视而不见。每个变更都受益于另一双眼睛。 |
| "稍后清理" | 稍后从不到来。审查是质量门控 — 使用它。 |
| "测试通过了所以没问题" | 测试是必要的但不充分。它们不捕获架构问题、安全问题或可读性问题。 |
| "变更太小不需要审查" | 小变更也可能引入安全漏洞或破坏边界情况。 |
审查完成后: