바이브코딩 하다 보면 이런 순간 다들 있을 거예요.

 

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 아이디어