7개 하네스를 10축으로 분석해, 각 축에서 “가장 강한 메커니즘”만 골라 끼운 이상적 AI 코딩 에이전트 설계도다.
목표는 3대 사고 — 거짓 “다 했어요”, 모호한 지시에 엉뚱한 코드, 위험한 명령 실행 — 을 구조적으로 불가능하게 만드는 조립 원리를 익히는 것.
채택의 원칙
채택 단위는 **“코드로 강제되는 메커니즘”**이지 슬로건이 아니다. “어떤 하네스가 1등인가”가 아니라 *“그 1등을 만든 부품이 무엇인가”*를 고른다.
비교 대상 7종: Claude Code · Codex · OMC · gajae-code · ouroboros · fable-ish · 내 패턴.
그림
요구 → 검증 → 다음 세대 개선까지의 전체 생명주기다. 빨간 관문 2개(시작·끝)와 초록 봉인 1개(실행 중)가 토대, 나머지는 그 위의 증폭기다.
flowchart TB
subgraph INTAKE["① 시작 관문"]
U[사용자 요구] --> DI["딥 인터뷰<br/>모호성 점수 ≤ 0.2 통과 전 실행 차단"]
DI -->|통과| SEED["불변 Seed 스펙<br/>단일 진실원천 SSoT"]
DI -->|모호함| U
end
SEED --> ORCH
subgraph ORCH["② 오케스트레이션"]
CL["Claude 지휘자<br/>게이트·적대검증"]
CL -->|변환할 타깃만 주입| WK["Codex 일꾼<br/>격리된 쓰기"]
CL --> TM["팀 워크트리<br/>병렬 격리"]
end
WK --> TOOL["③ 도구 파이프라인<br/>등록소→라우터→실행면"]
TM --> TOOL
TOOL --> GUARD
subgraph GUARD["④ 4중 가드레일 실행 봉인"]
G1[OS 샌드박스] --> G2[실행정책] --> G3[정적 판정] --> G4["LLM 경비원<br/>실패시 차단"]
end
GUARD --> VERIFY
subgraph VERIFY["⑤ 검증 관문"]
EV["증거 계약<br/>텍스트 아닌 증거 객체"] --> COV["커버리지 확인<br/>그 파일 진짜 건드림?"]
COV --> CR["비평가 적대검증<br/>자체승인 금지"]
CR --> RC["sha256 영수증<br/>실패시 차단·exit 2"]
end
VERIFY --> STATE["⑥ 영속<br/>이벤트소싱·SQLite·위키"]
STATE --> IMPROVE
subgraph IMPROVE["⑦ 자기개선"]
REFL[reflect 루프] --> TOUR["토너먼트 진화<br/>평가자 부정 차단"]
HOOK["훅 자동생성<br/>즉시 적용"]
end
IMPROVE -.다음 세대 Seed.-> SEED
HOOK -.런타임 규칙.-> GUARD
classDef gate fill:#fdd,stroke:#c00,stroke-width:2px
classDef safe fill:#dfd,stroke:#080,stroke-width:2px
class INTAKE,VERIFY gate
class GUARD safe
읽는 법: 빨간 블록(시작·검증)은 통과 못 하면 다음으로 못 가는 관문, 초록 블록(가드레일)은 실행 중 행위를 가두는 봉인, 점선은 피드백 루프다.
쉽게 풀기
AI 에이전트를 “신입 외주 개발자 한 명”으로 보면 쉽다. 일을 맡길 때 본능적으로 거는 안전장치를 코드로 자동화한 것이 이 설계다.
막으려는 3대 사고
거짓 완료: “검증 다 했어요” 말만 믿었는데 실제론 안 한 경우.
막연한 시작: 요구가 흐릿한데 일단 코드부터 쓴 경우.
컨텍스트 오염: 대화가 길어질수록 누적 잡음이 판단을 흐리는 경우.
이 3대 사고가 7단계 봉인으로 어떻게 막히는지, 그 흐름은 이렇다.
flowchart LR
A["①계약서 먼저<br/>(모호성 게이트+Seed)"] --> B["②책상 정리<br/>(fresh exec)"]
B --> C["③역할 분리<br/>(지휘자/일꾼)"]
C --> D["④단일 출입구<br/>(도구 파이프)"]
D --> E["⑤겹겹 자물쇠<br/>(4중 가드레일)"]
E --> F["⑥실물 영수증<br/>(검증 관문)"]
F --> G["⑦기억과 성장<br/>(영속+진화)"]
G -.경험 환류.-> A
단계
비유
핵심
① 시작 관문
계약서 먼저
모호성 ≤0.2 전엔 착수 차단, 합의는 못 바꾸는 Seed로 박음
② 컨텍스트 엔진
책상 정리
작업당 1회 실행·누적 0, 시스템 지시문 동결(캐시 적중), 압축 전 메모 flush
③ 오케스트레이션
역할 분리
Claude=지휘자, Codex=일꾼, 모델 경계가 방화벽, 일꾼엔 “고칠 대상”만 주입
④ 도구 파이프라인
단일 출입구
모든 도구가 등록소→라우터→실행면 한 줄 통과, 검문소는 하나
⑤ 4중 가드레일
겹겹 자물쇠
OS샌드박스→명령분해→정적판정→LLM경비원, 헷갈리면 차단(fail-closed)
⑥ 검증 관문
실물 영수증
증거 객체+커버리지+비평가 적대검증+sha256, 못 맞으면 exit 2
⑦ 영속+자기개선
기억과 성장
이벤트소싱 복원 + 토너먼트 진화 + 불만 신호→재발방지 훅 자동생성
핵심 정리
3대 실패와 봉인
실패 패턴
봉인 메커니즘
거짓 완료 (fable-ish, ralph, OMC)
증거 계약 + sha256 영수증 + 자체승인 금지
막연한 시작 (단일 에이전트 일반)
모호성 게이트(≤0.2 통과 전 차단)
컨텍스트 오염 (장기 세션)
fresh exec + StablePrefix + PreCompact flush
펼쳐보기: 축별 채택 출처(10축 전체)
축
채택 방식
출처
시작 게이트
모호성 게이팅 + 불변 Seed
ouroboros, gajae
컨텍스트
StablePrefix + fresh exec + PreCompact + 이벤트소싱
gajae, 내패턴, OMC, ouroboros
툴/확장
선언적 표면 + 중앙 파이프라인 + code-mode
Claude Code, Codex, gajae
가드레일
4중 독립 가드레일 + 역할 권한 분리
Codex, ouroboros
검증
증거 계약 + 영수증 + critic 분리 + coverage
ouroboros, gajae, OMC, 내패턴, fable-ish
오케스트레이션
이중모델 비대칭 + 티어 분배 + 워크트리 병렬
내패턴, Claude Code, OMC
자기개선
토너먼트 진화 + reflect + hookify
OMC, ouroboros, Claude Code
영속
이벤트소싱 + SQLite + supersedes 보존
ouroboros, Codex, 내패턴
DX
musl 바이너리 + doctor + 골든테스트
Codex, OMC, ouroboros
왜 충돌 없이 합산되나
직교하는 부품만 골랐기 때문이다. 같은 위협을 서로 다른 차원에서 덮으면 겹치지 않고 곱해진다.
flowchart TB
subgraph CTX["컨텍스트 4부품 = 4차원 분담"]
c1["공간·캐시"] --- c2["오염·누적0"] --- c3["손실·압축보존"] --- c4["시간·재현"]
end
subgraph GRD["가드레일 4중 = 독립 레이어의 곱"]
g1[OS] --> g2[정책] --> g3[정적] --> g4[LLM]
end
subgraph VFY["검증 4부품 = 누수 3종 차단"]
v1["자기보고→증거"] --- v2["자기승인→critic"] --- v3["미반영→coverage"]
end
OPEN["개방 vs 통제 모순<br/>정의는 자유·실행은 단일게이트"]
펼쳐보기: 직교성 상세 근거
컨텍스트 4부품: “공간(캐시)·오염(누적0)·손실(압축보존)·시간(재현)” 차원을 각각 덮어 겹치지 않는다.
가드레일 4중: 안전은 “가장 센 것 하나”가 아니라 독립 레이어의 곱. 하나가 우회돼도 나머지가 잡는다.
검증 4부품: 거짓 완료의 누수 3종(자기보고·자기승인·커버리지 미반영)을 각각 다른 하네스가 막는다.
개방 vs 통제 모순: 정의 표면은 자유, 실행 파이프라인은 단일 게이트로 분리해 해소한다.
채택하지 않은 것 (안티-패턴)
fable-ish fail-open(훅 예외 시 exit 0) → fail-closed로 뒤집어 채택
OMC 짧은 timeout + {continue:true} → 타임아웃 길게, 실패 시 차단
Codex OpenAI 생태계 종속 → provider 어댑터로 모델 중립 유지
거대 사양 복잡도(gajae 수백 줄, ouroboros 926 py) → “코드로 강제·프롬프트는 짧게” 정신만
ralph promise 자기신고 종료 → 다중신호 수렴(진화 0회면 수렴 거부)으로 대체
실제 예시
펼쳐보기: 한 문장 전체 정의
언어모델을 코딩 에이전트로 바꾸는 호스트 위에, ① 수학적 모호성 게이트로 시작을 막고 ② 불변 Seed 스펙을 SSoT로 박고 ③ 4중 독립 가드레일(OS샌드박스+실행정책+정적판정+LLM Guardian)로 행위를 봉인하고 ④ typed evidence + sha256 영수증 + 자체승인 금지 회로로 완료를 fail-closed 증명하며 ⑤ 이벤트소싱으로 세션을 넘어 재현·감사 가능하고 ⑥ 토너먼트형 진화 엔진으로 하네스 자신을 개선하는, 모델 중립 멀티런타임 Agent OS.
내 환경에서 현실적으로 구현 가능한 버전
제약: 실제로 쓰는 것은 Claude Code(호스트) + Codex(워커) + OMC(디스트리뷰션) 3종뿐. ouroboros/gajae의 Rust 크레이트·이벤트소싱·Starlark·OS 샌드박스 자체구현은 이식 비용이 비현실적. 따라서 그 정신을 기존 3종의 표면으로 근사한다.
이상안 메커니즘
내 환경 대응물
액션
모호성 게이트
OMC /deep-interview
비자명 작업 진입 의무화(ralplan)
불변 Seed SSoT
헌법형 SSoT 문서
.omc/SEED.md 고정, 직접편집 금지
증거+critic 분리
OMC critic+/verify+gate.mjs
자체승인 금지 게이트 의무 경유
sha256 영수증
내 패턴 영수증 회로
gate.mjs에 canonical-JSON sha256, exit 2
이중모델 분업
운영 중(Claude=게이트, Codex=워커)
edge-map 타깃 주입 규약 문서화
이벤트소싱 lineage
OMC state_*+session_search
trace_timeline로 근사
LLM Wiki 메모리
OMC wiki_*+MEMORY.md
supersedes 보존(valid_to) 규약
토너먼트 진화
OMC /self-improve
하네스 규율 개선에 주기 적용
hookify 런타임 규칙
settings.json hooks(미활용)
최대 갭 — 아래 참조
가장 큰 갭 = 하네스 레벨 자동 강제. 내 패턴의 핵심 약점은 “규율이 산문에 의존, settings.json에 차단 훅이 전무”였다. 단일 최고 레버리지 액션은 비어 있는 settings.json 훅을 채우는 것.
펼쳐보기: settings.json 훅 3종 + config.toml 전문
// ~/.claude/settings.json — update-config 스킬로 훅 3종 추가{ "hooks": { // (1) 위험 명령 차단 (현재 trusted라 느슨 → 봉인) "PreToolUse": [ { "matcher": "Bash", "command": "위험명령 정규식(rm -rf / system32 / sudo npm) + permissions.deny 조합으로 exit 2" } ], // (2) 종료 게이트 — fail-OPEN이 아닌 fail-CLOSED "Stop": [ { "command": "변경 발생 + 미검증이면 block. coverage uncertain도 차단." } ], // (3) 압축 전 보존 — wiki_add로 지식 flush "PreCompact": [ { "command": "현재 세션의 미기록 결정/함정을 wiki_add 또는 MEMORY.md에 append" } ] }}
# config.toml — 전역 안전 조임approval_policy = "on-failure" # 프로젝트별 봉인# skipDangerousModePermissionPrompt 해제, trusted 경로 축소
현실판 아키텍처 (3종으로 근사)
flowchart LR
U[요구] --> RP["OMC /ralplan<br/>= 시작 게이트"]
RP --> SEED[".omc/SEED.md SSoT"]
SEED --> CL[Claude 오케스트레이터]
CL -->|edge-map| CX[Codex 워커]
CX --> HK["settings.json hooks<br/>PreToolUse 차단<br/>= 가드레일 근사"]
HK --> VF["OMC critic + /verify<br/>+ gate.mjs sha256<br/>= 검증 폐루프"]
VF -->|exit2 block| CL
VF --> ST["OMC wiki + state<br/>= 영속"]
ST -.주기.-> SI["OMC /self-improve<br/>= 진화"]
SI -.규율 개선.-> SEED
구현 순서 (우선순위 백로그)
[즉시·최대효과] settings.json 훅 3종(PreToolUse/Stop/PreCompact) — 산문 규율을 코드 강제로.