Dual-Model Verification · Codex QA Integration

Claude Code가 쓴 코드를
Codex가 한 번 더 검사하게 했다

문제는 AI가 자기가 쓴 코드를 스스로 검사하면 자기 빈틈을 못 본다는 것이었습니다. 원래는 Claude Code(앤트로픽이 만든, 터미널에서 코드를 대신 써 주는 AI 도구)가 자기 코드를 스스로 QA(품질 검사)했습니다. 사람이 자기 글의 오타를 잘 못 찾듯, AI도 자기가 쓴 코드의 빈틈은 스스로 보기 어렵습니다. 그래서 OpenAI가 만든 다른 코딩 AI인 Codex를 두 번째 검사자로 붙였습니다. 이제 AI가 쓴 코드는 서로 다른 두 AI가 번갈아 검사합니다. 한쪽의 사각지대를 다른 쪽이 대신 잡아냅니다. 이 글은 그 구조를 내 하네스(harness, AI가 '다 했다'고 거짓말 못 하게 증거를 강제하는 감시 장치) 안에 어떻게 넣었는지 정리한 기록입니다.

3
Hard Gates
2
Models
4
Recovery Steps
7
Files Modified
서로 다른 두 AI로 교차 검증(같은 코드를 서로 바꿔서 검사)
Claude (Opus 4.6)

프로젝트 규칙 검사

Claude는 이 프로젝트만의 규칙을 잘 압니다. 검사하는 것은 세 가지입니다. '이건 절대 하지 말라'고 정해둔 금지 규칙, 프로젝트마다 다른 코드 패턴과 작성 스타일, 자료형(타입)이 서로 어긋나지 않는지입니다. 프로젝트의 맥락을 깊이 이해하는 것이 강점입니다.

+
Codex (GPT-5.4)

사각지대 보완

Codex는 같은 코드를 다른 관점에서 봅니다. Claude가 놓친 패턴, 보안 허점, 드물게만 터지는 예외 상황(엣지 케이스)을 잡아냅니다. 특히 적대 리뷰(adversarial-review, 일부러 약점을 찾아 공격하듯 살펴보는 검토)로 숨은 결함을 파고듭니다.

코드를 막는 3중 검문소, 게이트(gate, 조건을 못 채우면 통과를 막는 자동 검문)
1
Review Gate
하위 에이전트(큰 작업을 나눠 맡은 작은 AI 작업자)나 위임한 작업이 끝나면 훅(hook, 정해진 순간마다 자동으로 끼어드는 작은 스크립트)이 codex review --uncommitted 명령을 자동으로 돌립니다. 아직 저장(커밋)하지 않은 코드를 Codex가 검사하라는 명령입니다. 검사에서 찾은 결함에는 심각한 순서로 등급이 붙습니다. 가장 심각한 등급이 0건이면 통과로 판정하고 그 증거 파일을 남깁니다. 아래 상자는 이 검사를 돌리는 스크립트 이름과 판정 규칙입니다. 앞이 가장 심각한 등급의 이름이고, 뒤가 통과 판정의 이름입니다.
codex-review-gate.sh · CRITICAL 0 → PASS
2
Stop Gate
Claude가 답변을 끝내려는 순간 Codex 검사가 한 번 더 돌아갑니다. 검사 결과가 decision: "block" (차단 결정)이면 Claude는 답변을 멈추지 못하고 문제를 계속 고쳐야 합니다. 통과 결정이면 답변이 그대로 끝납니다. 아래 상자가 이 검문을 맡는 훅 스크립트입니다.
stop-review-gate-hook.mjs
3
Push Gate
.qa-cycle-passed + .codex-review-passed 이 두 개의 통과 증거 파일이 모두 있어야만 코드를 서버에 올릴(push) 수 있습니다. 앞 파일은 품질 검사(QA)를 통과했다는 표시이고, 뒤 파일은 Codex 리뷰를 통과했다는 표시입니다. 하나라도 없으면 올리기 명령이 종료 코드 2로 실패합니다. 아래 상자에 적힌 무조건 차단이 바로 그것입니다.
exit 2 — HARD BLOCK
전체 동작 흐름
코드를 쓰거나 고친 직후 (PostToolUse) · 코드 품질, 브라우저 저장소 사용 금지, 프로젝트 골격 규칙 위반을 각각 검사하는 훅 셋
code-quality-check.sh
no-localstorage.sh
scaffold-violation-check.sh
SubagentStop / TaskCompleted
codex-review-gate.sh → .codex-review-passed
user-proxy agent hook
도구 실행이 실패한 직후 (PostToolUseFailure) · 실패 횟수를 세고, 3번째 실패에는 Codex에 통째로 넘기는 구조(rescue)를 권함
failure-counter.sh (1/3, 2/3, 3/3→RESCUE)
error-fixer agent hook
Claude가 답변을 끝내려는 순간 (Stop) · Codex 검사 결과로 답변 종료를 허용할지 차단할지 정하고, 규칙을 스스로 고치는 자가개선 훅도 돌림
stop-review-gate-hook.mjs → ALLOW or BLOCK
self-improve-trigger.sh
코드를 서버에 올리기(git push) 직전 (PreToolUse) · 통과 증거 파일 두 개가 있는지 확인
품질 검사(QA) 통과 증거 파일이 있는지 확인 · 기존 .qa-cycle-passed
Codex 리뷰 통과 증거 파일이 있는지 확인 · 신규 .codex-review-passed
두 파일이 모두 있어야 서버 업로드(push) 허용
에러 복구 4단계

코드에 오류가 났을 때 고치는 순서를 3단계에서 4단계로 늘렸습니다. 새로 넣은 3번째 단계에서는 문제를 통째로 Codex(OpenAI의 코딩 AI, GPT-5.4 모델)에게 넘깁니다. 서로 다른 AI는 문제를 푸는 방식도 다릅니다. 그래서 앞 단계에서 막혔던 부분을 새로운 방법으로 풀어낼 수 있습니다.

1st
직접 수정
타입(자료형) 정의
불러오기 경로
동작 로직 수정
2nd
구조 변경
타입 검사 추가
optional chaining
다른 라이브러리로 교체
3rd
codex:rescue
Codex에게 통째로 맡김
완전히 다른 AI가
새로운 방법으로
4th
되돌리기(리셋)
변경을 되돌린 뒤
다른 방식으로
다시 시도

네 단계를 모두 시도해도 실패하면, 텔레그램 메시지로 사용자에게 알려 직접 판단을 맡깁니다.

상황별 검사 강제 수준(어떤 검문소가 실제로 도는가)
상황 Review Gate Stop Gate Push Gate 강제 수준
직접 처리 (하위 작업 위임 Task 사용) O O O 3단계 모두 강제
/team O O O 3단계 모두 강제
/manager O O O 3단계 모두 강제
직접 처리 (하위 작업 위임 Task 안 씀) X O 차단* Stop 검문소만
slash command 불확실 O 불확실 Stop 검문소만 확실

* 하위 작업(Task)을 쓰지 않으면 아래 이름의 Codex 리뷰 통과 증거 파일이 만들어지지 않습니다. 그러면 코드를 서버에 올리는(push) 길이 영구히 막힙니다. 이때는 /codex:review 명령을 직접 실행해 검사를 통과시켜야 합니다. 만들어지지 않는 파일: .codex-review-passed

무조건 차단하는 훅과 권고만 하는 훅, 두 등급으로 정리 HARD SOFT
Hook 차단 방식 (exit 2는 종료 코드 2로 명령을 실패시켜 막는다는 뜻) 분류 (무조건 차단 / 권고)
qa-gate-before-push.sh .qa-cycle-passed exit 2 HARD
qa-gate-before-push.sh .codex-review-passed exit 2 HARD
stop-review-gate-hook.mjs decision: "block" HARD
scaffold-violation-check.sh NEVER DO 라고 표시해 둔 '절대 금지' 패턴이 코드에 보이면 차단 HARD
no-env-commit.sh exit 2 HARD
failure-counter.sh 3번 실패하면 codex:rescue(막힌 작업을 Codex에 통째로 넘기는 명령)를 쓰라고 안내만 함 (막지는 않음) SOFT
codex-review-gate.sh 통과 증거 파일만 만들고 막지는 않음 SOFT
agent hook prompts 말로 된 지시(프롬프트)라 지킬지는 Claude의 판단에 맡김 SOFT
Codex 명령어
/codex:review
코드를 검토합니다 (Codex, GPT-5.4 모델)
/codex:adversarial-review
일부러 약점을 찾는 공격적 검토(적대 리뷰)
/codex:rescue
막힌 작업을 Codex에 통째로 맡기기 (버그를 고치는 기본 에이전트 bug-fixer 대신)
/codex:status
뒤에서 도는 작업의 진행 상태 확인