mcpField
A
adversarial-review

adversarial-review

github.com/basicmachines-co测试与质量4.4k160 次安装1 天前更新
代码仓库

关于 adversarial-review

供 Claude Code 或 Codex 使用的代码审查 Skill,通过 Claude 与 GPT/Codex 独立审查并交叉质疑发现,再供人工判断。

主要功能

  1. 01Claude 与 GPT/Codex 独立审查
  2. 02交叉反驳审查发现
  3. 03确定性 lint 与类型检查
  4. 04按置信度汇总结果
  5. 05不自动修改代码

适用场景

  1. 01合并前审查分支差异
  2. 02检查指定范围的变更文件
  3. 03区分规则违规与模型发现

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/basicmachines-co/basic-memory --skill adversarial-review

安装后在 Claude Code 中输入/adversarial-review确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

prompts/
refute.md
review.md
schemas/
findings.schema.json
verdicts.schema.json

详细介绍

对抗式代码审查

两位来自不同模型系列的审查者——Claude 和 Codex/GPT——分别独立审查同一份 diff,然后各自尝试反驳对方的发现。某项发现的可信度,取决于它能否经受住交叉质询。这能消除单个 LLM 审查的两种失效模式:自我证实(模型不会批评自己的工作)和自信的误报。

你是协调者,也是两位审查者之一

此技能可在 Claude Code 或 Codex 中运行。首先,识别你属于哪个模型系列(Claude 或 Codex/GPT)。然后:

  • 你是审查者 #1。你在当前会话中使用自己的工具,原生进行审查。
  • 另一个系列是审查者 #2。你通过子进程 CLI 调用它进行独立审查:启动一个全新的进程,不共享上下文——这正是独立性的意义所在。

调用“另一个模型”的 CLI:

如果你是……通过以下方式调用另一个模型……
Claudecodex exec (GPT)
Codexclaude -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。

预检

  1. 将 SKILL_DIR 设为此 SKILL.md 所在的目录。规范位置为 .agents/skills/adversarial-review(共享的 agent-skills 存储目录);Claude Code 通过 .claude/skills/adversarial-review 符号链接访问它,Codex 则通过自己的技能路径访问。无论哪种情况,prompts/ 和 schemas/ 子目录都是此文件的同级目录。
  2. 确认“另一个”模型的 CLI 位于 PATH 中(如果你是 Claude,则为 codex;如果你是 Codex,则为 claude)。如果找不到,请告知用户,审查面板将退化为单模型模式(失去跨厂商的优势),并询问他们是继续还是停止。
  3. 运行 "${DIFF[@]}"。如果没有输出,则报告“没有可与 $BASE 比较的审查内容”(若已设置 $SCOPE,也要提及),然后停止。
  4. 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)和任何建议的修复方案。

结尾询问用户要修复哪些发现(如果有)。在用户选定之前,不要编辑代码。 模型达成一致不代表结论正确——你的任务是呈现经过排序和交叉质询的清单,而不是宣称分支没有问题。

明确不做的事项

  • 不循环直至双方达成一致(模型会通过沉默而非正确来趋同)。
  • 不持久化产物或状态机——临时目录会被丢弃。
  • 不自动应用修复。

评论

支持 Markdown