바이브코딩 하다 보면 이런 순간 다들 있을 거예요.
AI한테 "테스트 돌려봐" 시켰더니 "네, 다 통과했습니다"라고 답이 옵니다. 그런데
그 말, 진짜 실행하고 나온 결과일까요, 아니면 그냥 그렇게 말하는 게 자연스러워서 나온 문장일까요?
코드를 하나하나 안 읽고 AI한테 맡기는 게 바이브코딩의 핵심인데, 정작 "실행했다"는 말 자체를 검증할 방법이 없다는 게 계속 마음에 걸렸습니다.
그래서 Codex가 "실행했다"고 말한 걸, 같은 대화 turn 안에서 실제로 일어난 일과
대조해주는 오픈소스 도구 ProofGate를 만들었습니다.
뭘 하는 도구인가
Codex의 생명주기 훅을 걸어서 이렇게 동작합니다.
1. Codex가 명령을 실행할 때마다(PostToolUse) 뭘 돌렸고 결과가 뭐였는지 기록
2. Codex가 답변을 마무리하려는 순간(Stop), 방금 한 말 중에 "실행했다"는 주장을 찾아냄
3. 그 주장을 같은 turn에서 실제로 실행된 기록과 맞춰봄
4. 근거가 없거나 결과와 말이 다르면 → 답변 종료를 막음
5. 다시 실행해서 진짜 증거가 생기거나, AI가 말을 정정하면 → 그때 통과
여기서 중요한 포인트 하나. 그냥 출력 텍스트에 exit code 0이라는 글자가 보인다고 성공으로 치지 않습니다.
Codex 세션 기록에 구조적으로 남은 종료 코드가 session, turn, 실제 출력이랑 다 맞아떨어질 때만 "진짜 실행됐다"고 인정합니다.
텍스트만 보고 속는 걸 막으려는 거예요.
ProofGate가 안 하는 것
이건 코드 리뷰 도구가 아닙니다. 그래서 아래는 신경 안 씁니다.
- 코드가 잘 짜였는지
- 로직이 의미적으로 맞는지
- 실패한 테스트를 대신 고쳐주는 것
- 빠진 명령을 대신 실행해주는 것
ProofGate가 확인하는 건 딱 하나입니다.
AI가 했다고 말한 그 작업, 정말 같은 turn 안에서 실행된 흔적이 있는가?
쓰는 방법 두 가지
1. Codex 플러그인으로 자동 검증
YAML 설정 따로 안 만들어도, Codex로 작업할 때마다 "실행했다"는 말을 자동으로 검증해줍니다.
git clone https://github.com/jadeokstory/completion-verifier.git
cd completion-verifier
python3 scripts/proofgate_plugin.py install
설치 후엔 Codex에서 /hooks 열어서 훅 내용 확인하고 신뢰(trust)하면, 그다음 작업부터 바로 적용됩니다.
2. Contract runner로 CI에 박아두기
릴리스 전에 꼭 통과해야 하는 테스트나 산출물을 completion-verifier.yml에 선언해둘 수 있습니다.
version: 1
gate: release-ready
checks:
- id: tests
type: command
command: [python3, -m, pytest]
timeout_seconds: 120
completion-verifier run --strict
검증 결과는 JSON이랑 Markdown 영수증으로 남아서, 나중에 "진짜 통과한 거 맞아?"라는 질문에 증빙으로 보여줄 수 있습니다.
안전장치는 이렇게 넣었습니다
- 예전 turn 실행 결과를 지금 증거로 재활용하지 않습니다
- session이나 turn 식별자가 없으면 일단 보수적으로 막습니다
- 행 출력 안에 그냥 문자열로 박힌 종료 코드는 안 믿습니다
- JSON credential, Authorization 헤더, URI에 낀 비밀번호, private key 형태는
- 저장·평가 전에 마스킹합니다
- 내부 평가기는 임시 디렉터리 + read-only sandbox에서만 돌아갑니다
- Codex 인증 파일은 직접 읽거나 복사하지 않습니다
지금까지 전체 테스트 55개, 독립 검증 시나리오 10개를 통과한 상태입니다.
아직 v0.1이고, 손 좀 봐야 할 것 같습니다
플러그인 마켓엔 아직 안 올렸고 소스 클론해서 써야 하는 프로토타입 단계입니다.
Codex 세션 형식이 바뀌면 어떻게 대응할지, 다양한 환경에서 실제로 잘 도는지,
redaction이 놓치는 케이스는 없는지, 설치 과정이 매끄러운지 — 이런 부분들
피드백과 기여 받고 싶습니다.
GitHub: https://github.com/jadeokstory/completion-verifier
특히 이런 의견 듣고 싶어요.
- 실제 바이브코딩하면서 자주 마주치는 "실행했다" 주장 유형
- 놓치기 쉬운 민감정보 출력 형태
- 잘못 차단되거나, 반대로 잘못 통과해버릴 수 있는 경계 사례
- 플러그인 설치·활성화 과정에서 걸리는 부분
- CI에 추가하면 좋을 verifier 아이디어