deep dive · harness · conformance · opus 4.8

Opus 4.8 Harness

AI가 '다 끝냈다'고 말만 하고 넘어가지 못하도록 빌드·테스트 같은 증거를 강제하는 감시 장치 묶음 — 이걸 하네스(harness)라고 부른다. 같은 하네스를 다른 회사 AI인 Codex(GPT-5.5)에서 Claude의 Opus 4.7 → 4.8 이라는 더 새 모델로 옮겼을 때, 무엇이 바뀌고 무엇을 그대로 적용했는지를 먼저 다룬다. 이어서 좋은 AI 코딩 하네스라면 갖춰야 할 8가지 조건에 비추어, /init-project · /team 라는 명령으로 짜 놓은 이 하네스가 품질 검문소(게이트)와 스스로 고치는 순환을 실제로 강제하는지 를 말이 아니라 실행 증거로 검증한다.

13
총 게이트(검문소)
11
실제로 막는 강제
5
/init-project
2
WIRED advisory

AI 엔진만 바꿨을 때 하네스에서 무엇이 바뀌고 무엇을 그대로 뒀나

CodexGPT-5.5 엔진옮겨온 쪽Claude CodeOpus 4.8 엔진현재Gate Substrate — shell · markdown (model-agnostic)게이트 13개(강제 11 + 권고 2) · 감지→수정→검증→반영 순환 · 5축 통합AI 모델을 바꿔도 게이트는 그대로 강제된다 — 바뀐 건 엔진뿐

하네스의 바탕(substrate)은 셸 스크립트와 마크다운 문서로만 되어 있어, 어떤 AI 모델을 쓰든 그대로 작동한다. 그래서 Codex(GPT-5.5)와 Claude Code(Opus 4.8)가 똑같은 검문소(게이트)를 공유한다 — '엔진 교체'란 답을 만드는 AI 모델만 바꾼 것이지, 검문소는 손대지 않았다는 뜻이다.

표 1 · 같은 하네스에서 Opus 4.7과 4.8은 무엇이 다른가

하네스 구성요소Opus 4.7Opus 4.8하네스에 미친 영향
게이트의 바탕
shell·markdown hook
동일동일모델 비종속 — 변화 없음
작업 도중 끼어들어 바로잡기한 번의 응답이 끝난 뒤에만 교정 가능대화 도중에도 지시(system message) 넣기 가능반복 작업 도중 바로잡기가 자연스러워짐 = mid-loop-question-detector 라는 훅(반복 중 '계속할까요?' 질문을 잡아내는 장치)과 맞물림
반복 입력을 재사용하는 캐시의 최소 크기4,0961,024게이트·규칙을 매번 다시 넣어도 캐시에 더 잘 걸림 → 비용 절감
모를 때 솔직함보통덜 우겨댐(과신 감소)거짓 '완료' 보고 감소 → '완료는 증거로만'(1번 조건) 강화
한 번에 읽는 분량(컨텍스트 창)1M1M많은 규칙을 한꺼번에 넣을 여유는 그대로
자가개선 신호의 정확도작동함솔직해져서 헛신호 감소엉뚱한 수정 신호가 줄어 순환이 안정됨

핵심: 하네스의 뼈대(검문소·순환·기억)는 4.7이든 4.8이든 똑같다 — 바탕이 AI 모델과 무관하기 때문이다. 달라진 건 모델의 능력 4가지(도중 개입·캐시 최소 크기·솔직함·신호 정확도)뿐이고, 이들은 각각 기존 장치·원칙을 강화하는 방향이다.

표 2 · Codex(GPT-5.5)에서 Opus 4.8로 옮길 때 — 무엇을 바꾸고 무엇을 그대로 뒀나

항목Codex · GPT-5.5Claude Code · Opus 4.8옮길 때 처리
답을 만드는 AI 엔진GPT-5.5Opus 4.8엔진만 교체 · 바탕은 그대로
게이트 13개
shell / exit-code
동일동일그대로 적용 — 옮기는 비용 0
서로 검토하는 구조(교차검증)Codex가 검토자 역할Opus가 구현 + Codex가 바깥에서 검토역할 나눔 유지 (git-push-adversarial-review-gate)
작업 도중 교정프롬프트 지시로 처리모델이 자체 지원(system message)옮긴 뒤 오히려 더 강해짐 — 별도 코드 불필요
self-improve · memory-bank파일로 된 바탕동일그대로 재사용 — 변경 없음

핵심: Codex로 옮긴 버전(/codex-harness-system)와 Opus 4.8 은 같은 바탕을 공유하므로, 하네스가 기준에 맞는지 보는 같은 검증이 그대로 적용된다. 옮긴다는 건 'AI 엔진만 교체'일 뿐, 검문소·순환·검증은 손대지 않았다.

그대로인 것 · 바탕(substrate)

게이트 13개(실제로 막는 강제 11 + 연결만 된 권고 2), self-improve 가 한 바퀴 도는 왕복 순환, 5개 축의 존재 여부는 어떤 엔진을 쓰든 똑같다. 그래서 Codex로 옮긴 버전(/codex-harness-system)과 Claude Code에 똑같은 검증이 적용된다.

Opus 4.8 delta · applied

mid-conversation system messages → 작업 도중 교정을 끼워 넣음 = mid-loop-question-detector 훅(반복 중 '계속할까요?' 질문 차단)과 맞물림. improved honesty → 거짓 '완료' 보고 감소 = '완료는 증거로만'. 반복 입력 캐시 최소 1,024(4.7은 4,096) → 게이트·맥락을 반복해 넣어도 캐시에 걸림 = 비용 절감.

무엇을 기준으로, 어떻게 측정했나

측정 기준을 바로잡았다. 이 글의 첫 판에서는 게이트가 실제로 막는지를 아무 설정도 안 한 cc-sync 폴더에서 쟀다. 그래서 프로젝트별 게이트를 확인 안 됨이라고 표기했다. 이건 틀렸다 — cc-sync 는 설정 파일을 백업·동기화하는 폴더라서 /init-project 명령을 한 번도 돌린 적이 없다. 올바른 기준선은 /init-project · /team 으로 셋업한 진짜 프로젝트다. 그런 프로젝트에서는 게이트가 설치되어 실제로 막는다. 또한 git-push-adversarial-review-gate 이번 작업에서만 5번이나 실제로 push(코드 업로드)를 막았다— '확인 안 됨'이 아니라 실제로 막는 게이트다.

그래서 이 검증은 게이트 스크립트(hook)에 일부러 규칙 위반 입력을 넣어 직접 돌려보고, block(exit 2)·감지(상태 파일 기록)·권고(메시지 출력) 가 실제로 발동하는지 확인한다(파일이 있나 단순 검색으로 때우지 않는다). user-scope 6 ENFORCED(block/detect) + advisory 2(self-improve trigger→check, round-trip VERIFIED) + /init-project 가 설치한 프로젝트별 5 ENFORCED = 실제로 막는 게이트 11 · 전체 13개. (권고 2개는 막지 않고 메시지만 넣으므로 '강제' 수에서 뺐다)

내 PC 전역 게이트 — 모든 프로젝트에 항상 켜져 있다

USER SCOPE — 모든 프로젝트에 항상 켜져 있는 게이트no-env-commit비밀정보(.env·키) 커밋 차단차단 · 실제 강제no-localstoragelocalStorage 사용 차단차단 · 실제 강제agent-browser-security브라우저 위험 명령 차단차단 · 실제 강제premature-completion-detector성급한 '완료' 선언 감지감지 · 실제 강제mid-loop-question-detector반복 중 '계속할까요?' 감지감지 · 실제 강제git-push-adversarial-review-gate다른 AI(Codex) 검토 후 업로드 허용차단 · 실제 강제이번에 5회 차단self-improve-trigger잘못된 커밋 → 다음 세션 신호권고 · 연결됨·확인됨self-improve-check다음 세션에 교훈 자동 주입권고 · 연결됨·확인됨

내 PC 전역에 항상 켜져 있는 게이트 8개다. 6개는 규칙을 어기면 실제로 작업을 멈추는 '강제'(다른 AI Codex로 교차검증하는 게이트 포함 — 이번 작업에서 5번 막았다). 나머지 2개는 멈추진 않지만 다음 세션에 교훈을 자동으로 넣어 주는 '권고'다(작동 확인 완료).

PROJECT SCOPE — /init-project 가 프로젝트마다 설치하는 게이트

/init-projectinstall-project-hooks.sh→ .claude/settings.json 에 게이트 설치프로젝트가 /init-project 를 돌리면 아래 5개가 설치·강제됨scaffoldviolation-check금지 패턴 차단차단ENFORCED ✓qagate-before-pushQA 없이 push 차단차단ENFORCED ✓codequality-check타입 검사 우회 차단차단ENFORCED ✓portlessrequireddev 서버 portless차단ENFORCED ✓taskquality-gateUI 변경 시 브라우저 증거차단ENFORCED ✓cc-sync(백업용 폴더)는 /init-project 를 안 돌려서 이 게이트가 없는 게 정상→ 빈 cc-sync 폴더가 아니라 /init-project·/team 으로 셋업한 프로젝트를 기준으로 평가해야 함

프로젝트에서 /init-project 를 한 번 돌리면 이 게이트 5개가 그 프로젝트에 설치되어 실제로 막는다. 그래서 평가도 빈 폴더가 아니라 /init-project 를 돌린 프로젝트를 기준으로 해야 한다.

게이트적용 범위무엇을 막나상태
no-env-commit · no-localstorage · agent-browser-securityuser비밀정보·localStorage·브라우저 보안ENFORCED ×3
premature-completion · mid-loop-questionuser성급한 완료·반복 중 질문 감지ENFORCED ×2
git-push-adversarial-review-gateuser업로드(push) 전 다른 AI(Codex) 교차검증ENFORCED (이번에 5회 차단)
self-improve-trigger · checkuser잘못된 커밋 → 다음 세션 주입WIRED · VERIFIED
scaffold-violation · qa-gate-before-push · code-quality · portlessproject금지 패턴·QA·코드 품질ENFORCED (/init-project 설치)
task-quality-gateprojectUI 변경 시 브라우저 증거ENFORCED (/init-project 설치)

전역 설정과 프로젝트 설정이 맞물려 도는 전체 구조

앞에서 본 전역 게이트와 프로젝트 게이트는 따로 노는 게 아니라 한 방향씩 맞물린다 — 설치는 전역에서 프로젝트로(위→아래), 학습은 프로젝트에서 전역으로(아래→위), 실행할 때는 한 번의 동작이 양쪽 게이트를 동시에 거친다.

① INSTALL 전역 → 프로젝트 · 1회 설치 ② RUN 한 동작 · 양쪽 동시 발동 ③ LEARN 프로젝트 → 전역 · 꾸준히 승격 USER SCOPE — ~/.claude/ · 모든 프로젝트 전역 · 항상 켜짐 PROJECT SCOPE — <repo>/.claude/ · /init-project 가 설치 · 프로젝트별 install-project-hooks.sh + hook-templates/ 어떤 게이트를 어느 시점에 걸지 연결 → 프로젝트에 게이트 설치 (1회) rules · skills · CLAUDE.md 도 함께 전역 설정 — 글로벌 게이트 PreToolUse · no-env · no-localstorage · agent-browser-security · push-review Stop · mid-loop · premature · self-improve-trigger UserPromptSubmit · self-improve-check · 알림 rules/ (185+) · /self-improve 실수·마찰 → 규칙으로 굳힘 /trend-harvester → 외부 패턴 흡수 한 번 학습 → 전 프로젝트 자동 적용 .claude/settings.json (설치된 사본 · git에 저장) 전역 템플릿의 프로젝트 사본 프로젝트 종류에 맞는 게이트만 + CLAUDE.md · scaffold 스킬 프로젝트 게이트 — 전용 PreToolUse · qa-gate-before-push · codex-review · no-verify-ban · ai-commit-msg-ban PostToolUse · scaffold-violation · code-quality SubagentStop · subagent-verify · claim-done-gate 프로젝트 작업 구현 · 빌드 · QA · 커밋 · push fix: 커밋 · QA 실패 · 사용자 불만 = 다음 개선의 신호(signal) /init-project 전역 템플릿 → 프로젝트 설정 Tool Event Edit · Write · Bash · git push · Stop PreToolUse / PostToolUse / Stop / UPS 전역 게이트 검사 프로젝트 게이트 검사 GATE ✓ exit 0 · allow ✕ exit 2 · block 자가개선 순환 Stop · self-improve-trigger → pending 다음 세션 UPS · self-improve-check 주입 → /self-improve → user rules/ 승격 memory-bank — 세션이 바뀌어도 기억을 저장·검색하는 토대 전역·프로젝트 공통 바탕 — 자가개선이 여기서 과거 실수를 찾아봄 USER scope PROJECT scope RUN · 이벤트/게이트 LEARN · 자가개선 승격 exit 2 = 차단(BLOCK)

설치(INSTALL)는 위에서 아래로(전역→프로젝트), 학습(LEARN)은 아래에서 위로(프로젝트→전역), 실행(RUN)은 가운데서 한 동작이 양쪽 게이트를 동시에 거쳐 통과/차단 판정을 받는다.

표 · 동작마다 게이트가 겹겹이 작동 — 전역과 프로젝트가 어떻게 겹치나

동작(이벤트)전역 게이트프로젝트 게이트합친 판정
PreToolUse
Edit · Write
no-env-commit · no-localstorage · agent-browser-security scaffold-violation · code-quality · no-localstorage 둘 중 하나라도 exit 2차단
PreToolUse
Bash · git push
git-push-adversarial-review-gate · qa-inventory-gate qa-gate-before-push · codex-review-gate · no-verify-ban 전부 통과해야 업로드 허용
Stop mid-loop · premature-completion · self-improve-trigger mid-loop · premature-completion 반복 규율 감지 + 자가개선 신호
UserPromptSubmit self-improve-check · prompt-enhancer · reminders mid-loop · premature 알림 다음 세션에 교훈 주입
SubagentStop
TaskCompleted
subagent-verify · claim-done-gate 하위 에이전트 · 작업 완료 검증

일부 게이트(no-env-commit · mid-loop · premature-completion)은 전역·프로젝트 양쪽에 동시 설치되어 이중으로 막는다 — 전역이 놓쳐도 프로젝트가, 프로젝트가 놓쳐도 전역이 잡도록. 프로젝트 게이트 묶음은 install-project-hooks.sh classify() 가 프로젝트 종류에 맞춰 필요한 것만 골라 설치한다.

핵심. 전역과 프로젝트는 따로 노는 게 아니라 한 방향씩 맞물린다 — 설치는 위에서 아래로(전역 표준을 프로젝트에 강제하고), 학습은 아래에서 위로(프로젝트에서 얻은 경험을 전역 표준으로 끌어올린다). 그래서 한 프로젝트에서 한 번 겪은 실수가 다음부터는 모든 프로젝트에서 자동 차단된다.

스스로 좋아지는 흐름을 이루는 부품들

/init-projectscaffold·QA·게이트 설치PRESENT/team1~5단계로 작업 지휘PRESENT/self-improve수정→대기→다음 세션 주입VERIFIED ✓/trend-harvester바깥 트렌드→규칙PRESENTmemory-bank — 세션이 바뀌어도 기억을 저장·검색하는 토대자가개선의 토대

/init-project → /team → /self-improve → /trend-harvester 네 부품 아래에 memory-bank 가 바탕으로 깔린다. 이 중 self-improve 만 실제로 돌려서 동작을 확인했고(VERIFIED), 나머지는 '있다·등록됐다'까지만 정직하게 표시한다.

스스로 고치는 순환 — 감지 → 수정 → 검증 → 반영

① 신호잘못된 커밋·불만·실패② 수정자가개선·버그수정③ 검증게이트·QA·증거④ 반영적용 또는 되돌림스스로 고침active 7/7 = 1.0

문제가 생기면 사람이 안 껴도 한 바퀴가 돈다 — 잘못된 커밋이나 사용자 불만이 '신호', 자가개선이 '수정', 게이트·QA가 '검증', 규칙 적용 또는 되돌림이 '반영'이다.

이번 작업 자체가 산 증거다 — 사이트 배포 버그가 '신호', 자가개선 규칙 2건과 생성기 v2가 '수정', 데이터 손실 없이 다시 배포하고 게이트를 통과한 것이 '검증', 실제 사이트에 반영된 것이 '반영'. 한 바퀴가 실제로 돌아 닫혔다.

하네스의 성숙 단계 — 0단계(L0)부터 7단계(L7)까지

L0–2프롬프트·스킬갖춤L3증거 검증갖춤L4실수 기억갖춤L5권고→강제현재 ◆L6자가개선 순환근접L7통합 운영다음 단계

오른쪽·아래로 갈수록 성숙한 단계다. L0~L4(프롬프트→증거 확인→실수 기억)는 이미 갖췄고, 지금은 L5 — '하세요' 권고를 '멈춰 세우는' 강제로 바꾸는 단계다. L6(스스로 고치는 순환)은 거의 닫혔고, L7(모든 도구를 하나로 통합 운영)이 다음 목표다.

user · project · plugin · MCP · trend

Personal Work OS5개 축 모두 존재 · 통합 목표user전역 게이트 강제project/init-project gateplugin~/.claude/pluginsMCP서버 연결trendtrend-harvester

L7은 이 5개 축(전역·프로젝트·플러그인·MCP·트렌드)이 하나의 개인 운영체계처럼 저절로 맞물려 도는 상태다. 5개 축이 모두 존재하긴 하지만 '저절로 통합됨'은 실제 실행 중에만 확인되는 것이라 정적인 문서로는 증명 밖 — 아직은 목표 지점이다.

좋은 하네스가 갖춰야 할 8가지 조건 — 지켰는지 확인

#쉽게 말하면충족
1완료 = 증거. “AI가 됐다고 말함”이 아니라 빌드·테스트·스크린샷 같은 재현 증거로만 완료 인정충족
2권고를 강제로. 중요 규칙은 “하세요” 안내가 아니라 위반 시 작업을 멈추는 게이트충족
3실수가 다음을 바꾼다. 한 번 틀린 건 규칙으로 남아 다음 세션에 자동 차단충족 · 실제로 확인됨
4스스로 고치는 순환. 감지→수정→검증→반영이 사람 개입 없이 한 바퀴충족 · 순환 완성도 1.0
5도구가 하나로. 에이전트·게이트·메모리·자가개선이 따로 놀지 않고 한 시스템presence 5/5
6최소 목표는 닫힌 순환(L6). 조직 확장(L7)은 그 다음근접
7다른 모델로 교차검증. 같은 모델의 맹점을 외부 모델(Codex)이 다시 본다충족 · 업로드 전 교차검증 게이트가 실제로 강제(이번에 5회 차단)
8화면은 띄워봐야 완료. 코드 통과 ≠ 화면 정상, 브라우저 캡처 필수충족 · UI 증거 게이트(/init-project 설치)

정직한 한계. 7·8번(다른 AI 교차검증·화면 캡처 증거)은 측정 기준을 바로잡은 뒤 충족으로 확인됐다 — 각각 전역에서 실제로 막는 강제(차단 증거 있음)와 /init-project 설치로 작동한다. L7의 '저절로 통합됨'만은 실제 실행 중에만 드러나는 것이라, 5개 축이 다 있다는 것만으로 '달성'이라 말하지 않는다. 표의 숫자는 실제로 잰 값이고, 'Codex에서 Opus 4.8로 옮기면 이렇다'는 해석은 추정 분석임을 구분해 둔다.

이어 보기