하네스 엔지니어링 측정 1편 — AGENTS.md 비우면 Codex도 fail-fast 안 지킨다

하네스 엔지니어링 측정 1편 — Codex AGENTS.md fail-fast 충실도 약·중·강 3 condition 비교

Codex와 Claude에 같은 명세를 3 condition으로 던졌다

Codex와 Claude에 동일한 Python 함수 명세를 3가지 setup에서 돌렸다. fail-fast 충실도가 약→중→강으로 갈렸고, 그 차이는 모델이 아니라 AGENTS.md 같은 하네스 파일 적용 여부에서 나왔다.

어제 발행한 하네스 엔지니어링 3대 구성요소 글에서 카파시의 이론(컨텍스트 파일·자동 강제 시스템·가비지 컬렉션)을 정리했다. 이 글은 그 이론을 같은 명세 1건으로 직접 측정한 1차 데이터다.

YES 3번 — 이런 적 있다면 이 글이 답이 된다

Codex와 Claude Code 차이를 1주 써보고 잘 모르겠다는 결론을 낸 적 있다.

같은 task로 통제 비교를 안 했기 때문에 모델 차이인지 setup 차이인지 분리 못 했다.

도구 비교 글은 많은데 “차이가 어디에서 나오나”를 측정한 글은 본 적 없다.

측정 setup

명세는 Blogger 발행 검증 함수다. verify_published_post(service, blog_id, post_id, expected_title, min_content_length) — 발행 직후 Blogger API로 post를 재조회해 title 일치·content 최소 길이를 검증한다. fail-fast 규칙 적용 (silent default 금지·예외 그대로 raise).

3 condition:

  1. Codex v1 — 하네스 0. AGENTS.md 없음. 사용자 시스템 인스트럭션 없음.
  2. Claude Opus 4.7 — CLAUDE.md 자동 로드. fail-fast 규칙·Iron Law of Verification 글로벌 메모리에 있음.
  3. Codex v2 — Codex v1과 같은 모델. AGENTS.md를 작업 디렉토리에 두고 프롬프트에서 “AGENTS.md 규칙을 적용하라” 명시 인용.

같은 모델·다른 하네스 비교는 1과 3 (Codex v1 vs v2). 다른 모델·다른 하네스 강도 비교는 2와 3 (Claude auto-load vs Codex 명시 인용).

측정 1 — fail-fast 충실도

조건 dict 필수 키 접근 타입 검증 라인수 fail-fast
Codex v1 .get(k, "") + None→”” 변환 없음 61
Claude .get(k, "") 빈값 default 없음 58
Codex v2 if k not in: raise KeyError isinstance + raise 73

Codex v1은 silent default를 두 군데 썼다. content가 None이면 빈 문자열로 변환하고, 키 없으면 빈값 default. fail-fast 규칙 위반에 가깝다. Codex v2는 같은 모델인데 default 0건. 모든 키 누락·타입 불일치를 raise로 처리한다.

Claude는 중간이다. default를 한 군데 썼다 (.get("title", "")). CLAUDE.md를 자동 로드해서 일반 fail-fast 톤은 따랐지만 dict 접근 세부 패턴까지는 엄격 적용 안 됐다.

측정 2 — Iron Law of Verification 자체 검증 행동

CLAUDE.md와 AGENTS.md 모두 “작업 완료 주장 전 검증 명령 실행” 규칙이 있다. 누가 실제 따랐나.

  • Codex v1: 일반 self-report. 검증 명령 미실행.
  • Claude: 명세 재확인 코멘트만. 검증 명령 미실행.
  • Codex v2: py_compile + ls + wc 실행 후 exit code·라인수·글자수 보고.

같은 규칙이 글로벌 메모리에 있어도 자동 로드일 땐 행동 변화로 안 갔다. 명시 인용일 때만 검증 명령이 실제 실행됐다.

측정 3 — 자동 로드 vs 명시 인용

어제 글에서 “프롬프트 = 부탁, 하네스 = 강제”라 정리했다. 이 측정이 그 명제를 직접 입증한다.

Claude의 CLAUDE.md 자동 로드는 부탁 강도에 가깝다. fail-fast 규칙이 메모리에 있고 글로벌 적용된다고 하지만 dict default 같은 세부 패턴까지는 강제 안 됐다. Codex v2의 AGENTS.md는 프롬프트에서 명시 인용했더니 default 0건·검증 명령 자동 실행으로 행동이 따라왔다.

자동 로드는 카파시 프레임의 컨텍스트 파일에 가깝고, 명시 인용은 자동 강제 시스템에 가깝다. 어제 글 3대 구성요소가 이 측정 데이터로 갈라진다.

한계 + 다음 측정

이 측정은 사례 1건이다.

  • Sampling 우연 미통제: Codex v1과 v2를 한 번씩만 돌렸다. Temperature·sampling 변동으로 v1이 우연히 silent default를 골랐을 가능성 0이라 단정 못 한다. 같은 setup 3회씩 9회 측정이 우연 통제 최소선.
  • Prompt position 효과 미분리: Claude의 CLAUDE.md는 시스템 프롬프트(앞), Codex v2의 AGENTS.md는 사용자 프롬프트 직전(뒤)에 위치. 행동 차이가 강제 강도인지 prompt position인지 통제 안 됐다.
  • 컨벤션 vs 코드 품질 구분: 이 글의 “fail-fast 충실도”는 Jason 컨벤션 기준이다. Codex v1의 None handling이 일반 production에는 더 적절할 수도 있다. “fail-fast 강 = 코드 품질 좋음”이 아니다.
  • 다른 측정 변수: Claude에 AGENTS.md 명시 인용 적용 시 변화·Codex의 더 긴 함수 명세·모델 버전 통제 등 모두 미측정.
  • 일반화 한계: 3 condition 사례 1건이다. 다른 task 5건+ 누적해야 fail-fast 충실도 spectrum을 일반 패턴이라 주장 가능.

다음 글에서 측정 2편을 진행한다. 이 글의 raw 데이터(Codex v1·v2·Claude 함수 코드 3개)는 GitHub gist에 공개했다 — 명세·결과 표·한계 모두 README에 포함.

FAQ

Q. Codex가 Claude보다 fail-fast 약한가?
A. 1차 측정 결과 같은 Codex 모델이 AGENTS.md 적용 여부에 따라 약→강으로 갈렸다. 모델 자체 차이가 아니라 하네스 차이로 보인다.

Q. AGENTS.md와 CLAUDE.md 차이는?
A. 자동 로드 vs 명시 인용 강도 차이. 자동 로드는 부탁에 가깝고 명시 인용일 때만 세부 규칙까지 강제된다.

Q. 1건 측정으로 일반화 가능한가?
A. 가설 입증 1건이다. 일반화는 다음 측정에서 5건+ 누적 후 결정한다.

관련 글


갱신일: 2026-05-05
저자: 닥터조지 (cd4761) — Claude Code·Codex 양쪽 운영 중. 측정 데이터 누적되면 갱신.

태그: #하네스엔지니어링 #AGENTS_md #Codex #ClaudeCode #failfast #하네스측정

댓글

이 블로그의 인기 게시물

Claude Opus 4.7 출시 총정리 — 뭐가 달라졌고 지금 써야 하나

맥 스튜디오 M4 Max 128GB 로컬 LLM 4개 속도 비교 — gemma4·llama3.3·qwen3 실측

Claude Code로 블로그 발행 15분을 1줄로 — 해고 후 첫 자동화 경험