Claude Code에서 Codex를 공식 지원한다면
OpenAI가 Claude Code용 Codex 플러그인을 공식으로 냈다. 설치해서 버그를 미리 심어둔 코드에 리뷰를 돌려봤다. 다른 회사 모델한테 리뷰를 맡기면 정말 버그를 더 잡는지 확인한 기록이다.
OpenAI가 Claude Code용 플러그인을 공식으로 냈다. openai/codex-plugin-cc. 자기네 Codex를 Anthropic 툴 안으로 넣어서, 코드 리뷰를 맡기거나 작업을 통째로 넘길 수 있게 한 거다. 경쟁사 CLI에 자기 모델을 꽂아주는 그림이라 일단 눈길이 갔다.
근데 소개 글들을 읽다 보면 하나같이 같은 얘기를 한다. 코드 짠 모델한테 그 코드를 리뷰시키는 건 자기 숙제 자기가 채점하는 셈이라, 다른 회사 모델을 붙여야 못 보던 걸 잡아준다는 거다. 맞는 말 같긴 한데, 정작 “그래서 진짜 뭘 잡더라”는 얘긴 잘 안 보였다. 그래서 답을 미리 아는 코드에 직접 돌려봤다.
뭐 하는 물건인가
플러그인 자체는 별게 없다. 이미 깔려 있는 codex CLI를 감싸서 슬래시 커맨드로 꺼내주는 거다. /codex:review는 지금 변경분을 리뷰하고, /codex:adversarial-review는 코드가 깨졌다고 가정하고 파고든다. 그 밖에 작업을 넘기는 /codex:rescue, 세션을 Codex로 옮기는 /codex:transfer도 있다. 내 환경에선 codex-cli 0.137.0이 돌았고 리뷰는 gpt-5.5가 했다.
/codex:review는 결국 안에서 codex review를 부른다. 그러니 아래 스크린샷도 그 CLI를 직접 돌린 실제 출력이다.
답을 아는 코드에 돌려봤다
리뷰가 뭘 잡는지 제대로 보려면 정답을 내가 알고 있어야 한다. 그래서 좌석 예매 모듈을 하나 짜면서 성격이 다른 버그를 세 개 숨겼다.
class SeatBooking {
async book(seatNo, userId) {
if (seatNo < 1 || seatNo > this.total) throw new Error("invalid seat");
if (this.booked.has(seatNo)) return { ok: false, reason: "already booked" };
await this.persist(userId, seatNo); // ← 여기서 네트워크 왕복
this.booked.add(seatNo);
return { ok: true, seatNo };
}
}
// 10장 이상이면 10% 할인
function priceWithBulkDiscount(unitPrice, qty) {
let total = unitPrice * qty;
if (qty > 10) total = total * 0.9; // ← "이상"인데 > 를 씀
return total;
}
function verifyBookingToken(input, secret) {
return input === secret; // ← 타이밍으로 새는 비교
}
book()을 보면 has()로 빈자리인지 확인하고 add()로 잡는데, 그 사이에 await가 하나 껴 있다. 두 사람이 같은 좌석을 거의 동시에 누르면 둘 다 “비었네” 하고 통과한 다음 둘 다 예약돼 버린다. 할인 함수는 주석엔 “10장 이상”이라 써놓고 조건은 > 10이라, 딱 10장 산 사람은 할인을 못 받는다. 토큰 검증은 === 한 줄인데, 첫 글자가 틀리는 순간 바로 false가 나와서 응답 시간만 재도 토큰을 한 글자씩 알아낼 수 있다. 셋 다 실무에서 흔히 나오는 것들이다.
그냥 시켰을 때
먼저 표준 리뷰, /codex:review부터 돌렸다.

동시성 문제랑 할인 경계, 둘을 정확히 짚었다. “두 book() 호출이 persist() 전에 둘 다 통과한다”까지 설명하는 걸 보면 대충 훑고 넘긴 건 아니다. 그런데 토큰 쪽 타이밍 문제는 그냥 지나갔다. 심어둔 세 개 중 두 개를 잡은 셈이다.
깨졌다고 치고 시켰을 때
이번엔 같은 파일에 “코드가 깨졌다고 치고 동시성이든 경계값이든 보안이든 샅샅이 훑어봐”라는 지시만 얹었다. adversarial 리뷰가 하는 게 이거다.

네 개가 나왔다. 아까 놓친 토큰 타이밍을 잡았고, 하나가 더 붙었다. book("1")처럼 숫자를 문자열로 넘기면 범위 검사는 통과하는데, Set은 "1"이랑 1을 다른 값으로 봐서 같은 자리가 두 번 예약된다는 거였다. 이건 내가 심은 게 아니다. 짜면서 나도 몰랐던 진짜 버그다. 확인해보니 맞는 지적이었다.
그리고 네 개 다 실제 버그였다. 그럴듯하게 써놨는데 알고 보면 틀린, 소위 헛소리가 하나도 없었다. 리뷰 도구에선 이게 은근히 중요하다. 가짜 지적이 끼기 시작하면 결국 사람이 하나하나 다시 확인해야 해서 안 하느니만 못해진다.
근데 이 코드, Claude가 짰다
여기까지만 보면 “Codex 잘 잡네”로 끝날 것 같은데, 걸리는 게 하나 있었다. 이 예제 코드를 짠 게 Claude다. 그러니까 지금은 자기가 짠 코드를 남한테 채점받는 셈이고, 크로스 리뷰가 값어치를 한다는 주장이 맞다면 딱 이럴 때 효과가 나야 한다.
그래서 반대로도 해봤다. 이 대화 맥락을 전혀 모르는 새 Claude한테 booking.js만 던져주고 리뷰를 시켰다. 여섯 개를 잡았다. 위 네 개에 더해 persist()가 실패하면 상태가 어긋난다는 것과 NaN 좌석번호가 검사를 통과한다는 것까지 짚었다.
| 실재 버그 | Codex 그냥 | Codex 세게 | Claude 블라인드 |
|---|---|---|---|
| 동시성 race → 이중예약 | ✅ | ✅ | ✅ |
| off-by-one 할인 경계 | ✅ | ✅ | ✅ |
| 타이밍-비교 토큰 (보안) | ❌ | ✅ | ✅ |
타입 강제변환 "1" vs 1 | ❌ | ✅ | ✅ |
이 정도 결과만 놓고 보면, 어느 회사 모델을 쓰느냐는 생각보다 중요하지 않았다. 그보다 리뷰를 얼마나 집요하게 시키느냐가 컸다. Codex도 그냥 시켰을 땐 보안이랑 타입 문제를 놓쳤는데, “깨졌다고 치고 샅샅이 훑어봐”라고 하니까 잡았다. 블라인드로 붙인 Claude는 평범하게 시켰는데도 그만큼 봤다. 물론 예제 하나로 일반화할 얘긴 아니다. 그래도 “다른 회사 모델이면 알아서 더 잘 잡는다”는 말은 적어도 여기선 맞지 않았다.
그래서 쓸 거냐
쓰긴 쓴다. 대신 기대치는 정확히 잡고 쓴다.
쓸모는 분명 있다. 코드를 머지하기 직전에 “이거 깨졌다 치고 샅샅이 훑어봐”를 한 번 돌려보면, 첫 리뷰가 흘린 걸 주워준다. 리뷰어가 다른 회사 모델이면 훈련 사각이 안 겹치니 좀 더 촘촘해지는데, 그건 덤이다. 이번에 헛소리가 하나도 없었던 것도 그 덤에 힘을 보탰다.
반대로 표준 /codex:review만 놓고 보면 그렇게까지 특별하진 않다. Claude Code한테도 똑같이 리뷰를 시킬 수 있고, 블라인드 Claude가 여섯 개 잡은 걸 보면 굳이 리뷰어를 갈아야만 나오는 것도 아니다. 자동으로 도는 것도 아니라 내가 커맨드를 쳐야 하고, 프로바이더 쿼터도 하나 더 쓴다.
그래서 결론은 소박하다. 매 PR마다는 안 돌린다. 대신 동시성이나 결제·인증처럼 틀리면 아픈 코드를 머지하기 전에 /codex:adversarial-review를 한 번 돌린다. 자기가 짠 걸 자기가 보는 데서 생기는 사각을 지우는 값싼 보험인 셈이다. 딱 그만큼은 확실히 한다.
설치
준비물은 ChatGPT 구독(무료 티어 포함)이나 OpenAI API 키, 그리고 Node.js 18.18 이상이다. Claude Code 안에서 순서대로 친다.
/plugin marketplace add openai/codex-plugin-cc # 마켓플레이스 등록
/plugin install codex@openai-codex # 플러그인 설치
/reload-plugins # 리로드해야 활성화됨
/codex:setup # Codex 준비됐는지 점검
/codex:setup이 Codex 설치·인증 상태를 확인해준다. codex CLI가 없으면 npm install -g @openai/codex로 깔면 되고, 깔렸는데 로그인이 안 돼 있으면 !codex login으로 붙는다. 여기까지 하면 /codex: 커맨드들이 뜬다. 앞에서 봤듯 실제로 값어치 하는 건 세게 미는 /codex:adversarial-review 쪽이니, 거기부터 써보면 된다.