통합 하네스 설계안 — 베스트 오브 베스트
통합 하네스 설계안 — 베스트 오브 베스트
한 줄 요약
7개 하네스를 10축으로 분석해, 각 축에서 “가장 강한 메커니즘”만 골라 끼운 이상적 AI 코딩 에이전트 설계도다. 목표는 3대 사고 — 거짓 “다 했어요”, 모호한 지시에 엉뚱한 코드, 위험한 명령 실행 — 을 구조적으로 불가능하게 만드는 조립 원리를 익히는 것.
[!note] 채택의 원칙 채택 단위는 **“코드로 강제되는 메커니즘”**이지 슬로건이 아니다. “어떤 하네스가 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 에이전트를 “신입 외주 개발자 한 명”으로 보면 쉽다. 일을 맡길 때 본능적으로 거는 안전장치를 코드로 자동화한 것이 이 설계다.
[!warning] 막으려는 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 |
[!note]- 펼쳐보기: 축별 채택 출처(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/>정의는 자유·실행은 단일게이트"]
[!note]- 펼쳐보기: 직교성 상세 근거
- 컨텍스트 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회면 수렴 거부)으로 대체
실제 예시
[!note]- 펼쳐보기: 한 문장 전체 정의 언어모델을 코딩 에이전트로 바꾸는 호스트 위에, ① 수학적 모호성 게이트로 시작을 막고 ② 불변 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 훅을 채우는 것.
[!note]- 펼쳐보기: 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) — 산문 규율을 코드 강제로.
- [즉시] config.toml 전역 안전 조임 + trusted 경로 축소.
- [단기] gate.mjs에 sha256 canonical 영수증 + critic 의무 경유 회로.
- [단기] 비자명 작업
/deep-interview//ralplan진입 의무화. - [중기] wiki supersedes 보존(valid_to) + state_* 기반 lineage 근사.
- [중기] Codex 단일계정 단일장애점 완화 — refresh_token 자동갱신 + 대량생성 watchdog.
- [장기]
/self-improve를 하네스 규율 자체에 주기 적용, sealed_files로 평가자 봉인.
요약 & 셀프체크
3줄 요약:
- 시작(모호성 게이트)·실행(4중 가드레일)·완료(증거+영수증+critic)의 세 봉인이 토대, 나머지는 그 위의 증폭기다.
- 채택 단위는 슬로건이 아니라 코드로 강제되는 메커니즘이며, 직교 부품만 골라야 충돌 없이 합산된다.
- 내 환경에서 이상안의 90%는 새 도구가 아니라 이미 깔린 OMC 스킬 + Claude Code 훅을 실제로 켜는 것으로 달성된다 — 최대 미실현 가치는 비어 있는 settings.json 훅 하나에 집중돼 있다.
스스로 답해보기:
- “검증 다 했어요” 한 줄을 통과시키지 않으려면 어떤 4개 부품이 동시에 필요한가? (증거 객체·커버리지·critic 분리·영수증)
- 가드레일은 왜 “가장 센 자물쇠 하나”가 아니라 “겹친 자물쇠”여야 하는가?
- 내 환경에서 단일 최고 레버리지 액션 하나는? 왜 그것인가?
연결
[!note]- 펼쳐보기: Codex 교차검증 / 분석 출처 보존(보조 축 상세) 이 설계안은 7개 하네스(Claude Code · Codex · OMC · gajae-code · ouroboros · fable-ish · 내 패턴)를 10축으로 분석한 결과를 종합한 것이다.
보조 축 상세(상태·아키텍처·DX):
- 상태/영속성: ouroboros 이벤트소싱(replay/resume/lineage 1급) + Codex jsonl rollout·SQLite state·memories·thread-store + OMC ReadPath/WritePath 타입·4단계 상태루트 해석 + 내 패턴 supersedes 보존 lifecycle(valid_to) + LLM Wiki(MEMORY.md 인덱스). 마크다운만 쓰는 Claude Code/fable-ish의 한계 극복.
- 아키텍처: Codex 120+ 크레이트 물리 분해 + ouroboros 9 provider 어댑터·결정적 router(모델 중립) + Claude Code 수직통합 모델 교체 자유.
- 배포/DX: Codex 정적 musl 바이너리·다채널·비대화형 CI 모드·다언어 SDK + OMC 3중 설치·/omc-doctor·HUD·다언어 문서 + ouroboros 526 테스트·골든테스트·pre-commit/CI.
검증 4부품 세부 근거: typed evidence는 형식을, sha256 영수증은 증명을, critic 분리는 독립성을, coverage_relation은 진짜 그 파일인지를 봉인한다. fable-ish coverage_relation 4단계는 결함(uncertain 통과)을 고쳐 게이트에 반영했고, Claude Code asyncRewake로 비동기 검증을 동기 차단 없이 루프에 합류시킨다. surface별 증거 강제(ultragoal): GUI=스크린샷 / CLI=로그 / API=블랙박스 / 알고리즘=adversarial.