关于 adversarial-review
供 Claude Code 或 Codex 使用的代码审查 Skill,通过 Claude 与 GPT/Codex 独立审查并交叉质疑发现,再供人工判断。
主要功能
- 01Claude 与 GPT/Codex 独立审查
- 02交叉反驳审查发现
- 03确定性 lint 与类型检查
- 04按置信度汇总结果
- 05不自动修改代码
适用场景
- 01合并前审查分支差异
- 02检查指定范围的变更文件
- 03区分规则违规与模型发现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ basicmachines-co/ basic-memory --skill adversarial-review安装后在 Claude Code 中输入/adversarial-review确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
prompts/refute.mdreview.mdschemas/findings.schema.jsonverdicts.schema.json详细介绍
对抗式代码审查
两位来自不同模型系列的审查者——Claude 和 Codex/GPT——分别独立审查同一份 diff,然后各自尝试反驳对方的发现。某项发现的可信度,取决于它能否经受住交叉质询。这能消除单个 LLM 审查的两种失效模式:自我证实(模型不会批评自己的工作)和自信的误报。
你是协调者,也是两位审查者之一
此技能可在 Claude Code 或 Codex 中运行。首先,识别你属于哪个模型系列(Claude 或 Codex/GPT)。然后:
- 你是审查者 #1。你在当前会话中使用自己的工具,原生进行审查。
- 另一个系列是审查者 #2。你通过子进程 CLI 调用它进行独立审查:启动一个全新的进程,不共享上下文——这正是独立性的意义所在。
调用“另一个模型”的 CLI:
| 如果你是…… | 通过以下方式调用另一个模型…… |
|---|---|
| Claude | codex exec (GPT) |
| Codex | claude -p (Claude) |
流程中的其他部分完全对称。下面的 prompts/ 和 schemas/ 路径都相对于此技能自身的目录(即此 SKILL.md 所在位置)解析。
输入
两个相互独立的可选输入:
BASE— 要与之比较的 ref。默认值为main。SCOPE— 用于缩小审查范围的 pathspec(例如src/basic_memory)。默认值:无(整个 diff)。
两者彼此独立:ref 和 pathspec 不能互换。在预检时只构建一次规范 diff 命令,并在下文各处重复使用——不要在行内重新拼写 diff 命令(分散且不一致的写法正是此前出错的原因)。将其构建为 argv 数组,而不是字符串,这样 $SCOPE 中的空格或 glob 字符才能完整保留:
BASE="${BASE:-main}"
DIFF=(git diff "$BASE...HEAD") # argv array — never a scalar string
[ -n "$SCOPE" ] && DIFF+=(-- "$SCOPE") # pathspec stays one argument even with spaces
DIFF_STR=$(printf '%q ' "${DIFF[@]}") # shell-quoted rendering, for embedding in a prompt
要运行它,请使用 "${DIFF[@]}"(加引号,不进行单词拆分)。要将它作为文本嵌入子进程提示词中,请使用 $DIFF_STR。
预检
- 将
SKILL_DIR设为此 SKILL.md 所在的目录。规范位置为.agents/skills/adversarial-review(共享的 agent-skills 存储目录);Claude Code 通过.claude/skills/adversarial-review符号链接访问它,Codex 则通过自己的技能路径访问。无论哪种情况,prompts/和schemas/子目录都是此文件的同级目录。 - 确认“另一个”模型的 CLI 位于 PATH 中(如果你是 Claude,则为
codex;如果你是 Codex,则为claude)。如果找不到,请告知用户,审查面板将退化为单模型模式(失去跨厂商的优势),并询问他们是继续还是停止。 - 运行
"${DIFF[@]}"。如果没有输出,则报告“没有可与 $BASE 比较的审查内容”(若已设置$SCOPE,也要提及),然后停止。 RUN=$(mktemp -d)— 用于存放另一个模型输出的临时目录。仅临时使用,绝不提交。不保留任何产物,也不创建状态文件。
阶段 0 — 确定性检查(在模型运行前)
模型在否定语句(“绝不要做 X”)方面存在统计性盲点。使用工具而非提示词来强制执行机械性的代码规范,并将命中项视为高可信事实(与模型发现分开报告):
- 如果 diff 涉及
src/,运行just lint和just typecheck。 - 在 diff 中搜索可能违规的代码规范:带默认值的
getattr(.*,.*,、裸except:/except Exception: pass、函数作用域内的导入。
阶段 1 — 独立审查(你和另一个模型并行进行)
两位审查者收到相同的简报:prompts/review.md 和仓库的 CLAUDE.md 内部规则,
审查来自 "${DIFF[@]}" 的差异。双方都输出符合 schemas/findings.schema.json 的发现。
你的原生审查: 按照 prompts/review.md 自行审查。将你的发现保留为该 JSON 结构。
另一个模型的审查——从仓库根目录运行与你匹配的那一行:
始终将 codex 的标准输入重定向自 /dev/null——如果标准输入是管道(例如调用在后台运行),codex exec 会阻塞在“Reading additional input from stdin...”并失败。
# You are Claude → run Codex:
codex exec -s read-only \
--output-schema "$SKILL_DIR/schemas/findings.schema.json" \
-o "$RUN/other_findings.json" \
"$(cat "$SKILL_DIR/prompts/review.md")
Review the diff: $DIFF_STR" </dev/null
# You are Codex → run Claude (read-only via plan mode; parse the JSON block it returns):
claude -p --permission-mode plan --output-format json \
"$(cat "$SKILL_DIR/prompts/review.md")
Review the diff: $DIFF_STR
Return ONLY a JSON object matching this schema:
$(cat "$SKILL_DIR/schemas/findings.schema.json")" </dev/null > "$RUN/other_raw.json"
# claude --output-format json output shape varies by CLI version: it may be a JSON ARRAY
# of event objects, OR a single result object. Normalize before reading: if it's an array,
# take the element with type=='result'; otherwise use the object as-is. Then read its
# .result string, strip the ```json fence if present, and parse that.
# (Verified empirically: the CLI in this environment emits the array form.)
Codex 编排运行时说明:
claude -p需要网络访问,而 Codex 的默认沙箱会阻止网络访问。请在项目已获信任且允许网络访问的 Codex 会话中运行它(或在提示时批准claude调用)。保持 Codex 自身的沙箱开启——不要为了访问网络而绕过它。
为每条发现标注其来源(claude / codex)。
阶段 2 — 交叉反驳
每个模型都尝试根据 prompts/refute.md 反驳另一个模型的发现(裁决需符合 schemas/verdicts.schema.json)。
- 你原生地反驳另一个模型的发现。
- 另一个模型反驳你的发现——用相同方式再次调用它(将
prompts/review.md换成prompts/refute.md,附上你的发现 JSON 和$DIFF_STR,以便它依据正确的基准和范围进行判断;对于 Codex,使用--output-schema "$SKILL_DIR/schemas/verdicts.schema.json")。
按 id 将裁决与发现对应起来。
阶段 3 — 综合并报告(不自动修复)
合并并去重(相同文件 + 行号重叠 + 相同根因 = 一条发现),根据来源分配置信度:
- 高 — 两个模型独立发现,或一个模型发现后得到另一个模型支持。
- 中 — 一个模型发现;另一个无法反驳,但没有独立发现。
- 低 / 存在争议 — 一个模型发现,另一个模型予以反驳。保留该发现,呈现双方观点,让人工判断。绝不悄然删去存在争议的发现。
- 确定性检查命中项应作为事实单独报告,与模型评审结果分开。
按 严重性 × 置信度 排序。提供紧凑表格:severity | confidence | file:line | claim | found-by / upheld-or-refuted-by。针对高置信度发现补充说明其原因(why)和任何建议的修复方案。
结尾询问用户要修复哪些发现(如果有)。在用户选定之前,不要编辑代码。 模型达成一致不代表结论正确——你的任务是呈现经过排序和交叉质询的清单,而不是宣称分支没有问题。
明确不做的事项
- 不循环直至双方达成一致(模型会通过沉默而非正确来趋同)。
- 不持久化产物或状态机——临时目录会被丢弃。
- 不自动应用修复。