Worth saying out loud: this works in reverse too. I have Codex review Claude's diffs with a checklist tuned to Claude's failure modes (over-abstraction, gratuitous helper extraction). Different agents, different sins.
Codex is fast and overshoots; Claude is a pedantic reviewer. Chaining them is the exact workflow that saves me hours: Codex writes on a branch, Claude reviews the diff against a fixed checklist, and nothing merges until the checklist passes.
Every Codex branch gets a written review from Claude with findings ranked blocker/warn/nit before you look at it. You read a triaged review instead of a raw 800-line diff.
Give Codex the task and force branch discipline. The review step depends on a clean diff against main, so don't let it commit to main directly.
git switch -c codex/refactor-payment-retries
codex exec "Refactor the payment retry logic in src/payments to use exponential backoff. Commit when tests pass."The checklist is the whole trick. Without one, Claude produces a vague LGTM. Mine is short and brutal, tuned to Codex's actual failure modes: scope creep, deleted tests, and swallowed errors.
# .agent/review-checklist.md
Review the diff for:
1. SCOPE — changes outside the stated task. List every file touched that the task did not require.
2. TESTS — any test deleted, skipped, or weakened (looser assertion, broader catch).
3. ERRORS — swallowed exceptions, empty catch blocks, error paths that now return defaults.
4. BEHAVIOR — public API or serialized-format changes not mentioned in the task.
5. DEPS — new dependencies or version bumps.
Rank each finding BLOCKER / WARN / NIT. If nothing found in a category, say so explicitly.Pipe the diff in, keep the checklist as the prompt frame. Headless (-p) keeps this scriptable; you get the review on stdout.
git diff main...codex/refactor-payment-retries | claude -p "You are reviewing another agent's diff. Apply .agent/review-checklist.md strictly. The stated task was: refactor payment retries to exponential backoff. Diff follows on stdin." > review.mdFeed blockers straight back to Codex as a fix task. You only get involved if the second review still has blockers — in my logs that's about 1 in 5 tasks.
codex exec "Address the BLOCKER findings in review.md on this branch. Do not fix WARN or NIT items. Commit each fix separately."Second pass reviews just the new commits, which keeps it cheap and focused. Same checklist.
git diff HEAD~3..HEAD | claude -p "Re-review: do these commits resolve the BLOCKER findings in review.md without introducing new issues? Answer PASS or FAIL with reasons."The review becomes part of the record. Reviewers see what the machine already checked and spend their attention on design instead of hunting deleted assertions.
gh pr create --head codex/refactor-payment-retries --fill
gh pr comment --body-file review.mdYour run report keeps the confidence rating honest.
Sign in to add your report — every count here is backed by a named account.
Useful evidence gets promoted into the structured record above — verified fixes, failed approaches, and reproductions all started as comments.
Worth saying out loud: this works in reverse too. I have Codex review Claude's diffs with a checklist tuned to Claude's failure modes (over-abstraction, gratuitous helper extraction). Different agents, different sins.
Agreed — the asymmetry is the point. A model reviewing its own output shares its own blind spots.
Just wired this into a GitHub Action triggered on codex/* branches. Review lands as a PR comment ~3 min after push. Happy to write it up if there's interest.
Sign in to join the discussion, vote, and verify fixes.
I ran a small controlled version of this: 20 Codex tasks, half reviewed by this workflow, half merged straight. Reviewed half: 1 escaped defect. Unreviewed: 6. The checklist matters more than the model — Sonnet with the checklist beat Opus without it.