하네스는 '모델의 지능'이 아니라 그 주변의 결정론적 인프라(Claude Code 소스 기준 98.4%)로 굴러간다. rule·skill·workflow·memory·orchestrator가 전부 그 위에 서는 토대 — 그게 hook pipeline이다. 프롬프트·rule(SOFT)은 입력으로 우회되고 compaction에 지워지지만, hook의 exit code(HARD)는 에이전트 주소 공간 밖에서 무시 불가하게 닫는다. 13개 이벤트에 127개 hook을 배선해 286개 rule 중 핵심을 exit 2로 강제한다.
근거 — github.com/jung-wan-kim/cc-sync · ~/.claude 공개 미러 (settings.json · hooks/ · rules/)
Claude Code 소스 분석은 에이전트 신뢰성의 98.4%가 결정론적 인프라(권한 게이트·컨텍스트 관리·복구)이고 AI 추론은 1.6%임을 보인다. 하네스를 층으로 보면 — 맨 위 모델 추론, 그 아래 orchestrator·skill·rule·memory(운영 지식). 그리고 이 모든 것을 강제 가능하게 만드는 맨 아래 토대가 hook pipeline이다. rule이 "무엇을 하라"면, hook은 "안 하면 못 지나간다". 토대가 없으면 위층은 전부 부탁일 뿐이다.
그렇다면 왜 rule(SOFT)은 토대가 못 되고 hook(HARD)만 토대가 되는가 — 같은 규칙이라도 어디에 두느냐가 강제력을 가른다.
"이렇게 해주세요" — 협력 요청
"조건 미충족 → 차단" — 구조적 강제
에이전트 턴은 열린 채로 흘러가지 않는다. 세션 시작 → 프롬프트 제출 → (도구 실행)× → 종료의 모든 경계에 hook이 끼어든다. 내 시스템은 이 13개 이벤트에 clawd-hook.js(관측 디스패처)를 공통으로 깔고, 그 위에 이벤트별 게이트/주입기를 배선했다. 역할은 넷 — 차단(block, exit 2) · 주입(inject, 컨텍스트) · 검사(check, 기록) · 관측(observe).
exit 2를 반환하는 hook은 도구 호출을 물리적으로 차단한다. 아래 게이트들은 "완료했다"는 모델의 자기 보고를 신뢰하지 않고, 증거(파일·해시·acceptance)를 요구한다. 증거가 없으면 push도 commit도 workflow도 종료도 통과되지 않는다.
코드 변경이 있는데 .qa-cycle-passed(PASS·해시·1시간 이내)가 없으면 push 차단. 해시가 HEAD와 불일치해도 차단.
Codex 적대적 크로스 리뷰에서 CRITICAL이 남아 있으면 push 차단. 단일 모델 자기검증의 맹점을 다른 모델로 닫는다.
Workflow 호출이 6패턴 중 하나를 선언하지 않으면 차단. 무분별한 5-리뷰어 패널 낭비를 구조로 막는다.
substantive 작업이 acceptance 증거로 재검증되지 않으면 세션 종료 차단. "헛완료(거짓 완료)"를 종료 시점에 잡는다.
.env·API 키·시크릿을 stage/commit하려 하면 차단. 인코딩된 시크릿까지 스캔한다.
웹 파일의 localStorage 사용을 차단(Supabase Auth 토큰 리터럴만 예외). 사용자 데이터는 서버에.
프로젝트 scaffold의 NEVER DO 패턴 위반을 즉시 차단. 프로젝트 컨벤션을 구조로 강제.
UI/비-UI 변경이 verdict=PASS인데 acceptance_verified[]가 없거나 미충족이면 차단(anti-Goodhart).
이 페이지를 조사하던 중, 내가 실행한 읽기 전용 명령이 qa-gate-before-push.sh에 의해 HARD BLOCK됐다. 명령 안에 grep '…|git push|…'라는 "git push" 문자열이 들어 있었기 때문이다. 게이트는 명령 문자열에서 그 부분열을 발견하고 fail-closed로 차단했다.
이것이 hook 강제의 본질이다 — 게이트는 의도를 추측하지 않는다. 조건(문자열/증거)이 충족되지 않으면 무조건 막는다. 과대 매칭 false-positive라는 대가가 있지만, "무시 가능한 규칙"보다 "가끔 과하게 막는 규칙"이 하네스 신뢰성에는 이득이다.
가장 위층인 dynamic workflow조차 이 토대 위에서만 안전하다. dynamic workflow는 강력하지만 비싸다(수십 개 subagent를 spawn). workflow-cost-gate.sh가 모든 Workflow 호출이 6개 오케스트레이션 패턴 중 하나를 meta.description이나 // pattern: 주석에 명시적으로 선언하도록 요구한다. 미선언 → exit 2. 통과한 호출은 workflow.jsonl에 기록된다. 즉 동적 ceiling(workflow)이 evidence를 만들고 정적 floor(hook)가 그것을 검증하는 — 토대와 그 위층의 폐루프다.
동적 ceiling(opt-in workflow)이 evidence를 생산하고, 정적 floor(항상 ON인 hook)가 그 evidence를 검증한다. team-deliver.js workflow가 항목별 acceptance_verified[]를 .qa-evidence.json에 기록하면, task-quality-gate.sh(HARD)가 그 증거의 충족 여부를 exit code로 확인한다. workflow가 만들고 hook이 닫는 — 강제의 폐루프.