I Made Claude Code and Codex Argue About My Code Until They Agreed A developer wired OpenAI's Codex CLI into Claude Code as an adversarial reviewer with a convergence loop, then pointed the loop at its own implementation. The code failed the review three times before passing, and every failure revealed a real bug, including broken output capture, false convergence detection, and Windows command-line length limits. TL;DR : I wired OpenAI's Codex CLI into Claude Code as an adversarial reviewer with a convergence loop. Then I pointed the loop at its own implementation. It failed the review three times before passing, and every single failure was a real bug. Here's the whole story, with the prompts and shell recipes you can steal. A while ago Siqi Chen posted his favorite way of working with frontier models: step 1. ask it to write a plan step 2: "please get second opinions from codex CLI using gpt-5.6-sol @ max effort and kimi CLI using kimi 3. Revise your plan with any sound findings. repeat until convergence or up to 5 rounds." There's also a companion repo, adversarial-execution https://github.com/blader/adversarial-execution , which applies the same idea at the other end: before you mark work as done , fresh reviewer sessions have to pass it with evidence, in a loop, until a fresh round finds nothing new. Two ideas jumped out at me: I already had a Claude Code skill that wraps the local codex CLI as a second engineer: consult it read-only, delegate a fix, run a git-aware review, resume a session. All useful. All one-shot. No loop anywhere. So I asked Claude Code to study the tweet and the repo and tell me whether the skill was worth upgrading. Claude wrote a proposal: two new modes a plan-review convergence loop and a done-gate , plus supporting rules. Decent plan. Then came the fun part. Before touching anything, I had Claude send the proposal itself to Codex for an adversarial review, using the exact contract style the proposal was recommending. Verdict: FAIL. Eight gaps, seven of them major. And they weren't nitpicks. My three favorites: The output capture in the existing skill was broken. The recipes piped codex exec output through tail -40 and told Claude to grab the session id "from the header". But the header is at the tail shows the end. On any long run the session id is simply gone. Better yet: this exact failure happened PIPESTATUS you get tail 's exit code, not codex's. False convergence. My loop definition said: converged when a round brings "no new sound findings, only repeats". Codex pointed out that a finding I accepted but fixed incompletely would come back as a "repeat" and get waved through. A repeated unresolved finding has to stay open. And hitting the round cap needed an explicit NOT CONVERGED outcome instead of quietly presenting the last plan as final. Windows command lines have a length limit. Passing a plan, a diff, and the round history as one quoted shell argument blows past ~32k characters. Codex suggested the CLI's stdin form codex exec ... - < prompt.txt , which my own skill was accidentally blocking with an unconditional