5. ouroboros
한 줄 요약
ouroboros는 막연한 아이디어를 소크라테스식 인터뷰 → 불변(immutable) Seed 스펙 → Double-Diamond 실행 → 3단계 평가 → 진화 루프로 돌려 “검증된 코드베이스”로 바꾸는 로컬 우선(local-first)·이벤트소싱 기반의 Agent OS다.
왜 배우나: “프롬프트 한 번 → 결과 한 번”의 한계를 넘어, 무엇을 만들지 명확해질 때까지 캐묻고 → 만들고 → 채점하고 → 스스로 고치기를 반복하는 자기개선 골격이 어떻게 코드로 구현되는지 보여주는, 에이전트 하네스의 종합 교본이기 때문이다.
그림
아래는 보조 흐름도다. 이름 그대로 자기 꼬리를 먹는 뱀(우로보로스) = 평가 결과가 다음 세대의 입력이 되는 자기개선 루프가 핵심이다.
flowchart TD A["아이디어<br/>(막연함)"] --> B["1. 소크라테스 인터뷰<br/>bigbang"] B --> G1{"Ambiguity 게이트<br/>1 - Σ(clarity·weight) ≤ 0.2 ?"} G1 -- "아직 모호함" --> B G1 -- "충분히 명확" --> C["2. 불변 Seed 스펙<br/>(YAML 단일 진실원천)"] C --> D["3. Double-Diamond 실행<br/>오케스트레이터·병렬·증거검증"] D --> E["4. 3단계 평가<br/>Mechanical → Semantic → Consensus"] E --> F["5. reflect 진화<br/>평가결과 → 다음 세대 Seed"] F --> G2{"수렴 게이트<br/>similarity ≥ 0.95 / 정체 / 최대 30세대 ?"} G2 -- "아직 진화 중" --> D G2 -- "안정됨" --> H["검증된 코드베이스"] subgraph 영속성["이벤트소싱 코어 (~/.ouroboros/ouroboros.db)"] Z["모든 상태를 불변 이벤트로 적재<br/>→ replay·resume·lineage"] end D -.기록.-> Z E -.기록.-> Z F -.재구성.-> Z
쉽게 풀기
비개발자를 위해 단계별로 풀어보자. ouroboros를 **“까다롭지만 일 잘하는 건축 사무소”**라고 생각하면 쉽다.
- 묻고 또 묻기 (인터뷰) — 보통 AI 도구는 “집 지어줘” 한 마디에 바로 삽을 뜬다. ouroboros는 건축가처럼 “방은 몇 개? 예산은? 햇빛 방향은?”을 충분히 명확해질 때까지 캐묻는다. 이 “명확함”을 느낌이 아니라 수학 점수로 잰다. 모호함 점수가 0.2 이하로 떨어져야만 다음 단계로 넘어간다.
- 설계도를 못 박기 (Seed) — 인터뷰 답을 **고치지 못하는 설계서(YAML)**로 박아둔다. 이게 단 하나의 “진실”이 되어, 작업 도중 “원래 뭘 만들기로 했더라?”가 흔들리지 않는다.
- 만들기 (Double-Diamond 실행) — 여러 작업자(에이전트)가 의존성 순서대로 나뉘어 일하고, 충돌이 나면 조정자(coordinator)가 검토한다. “다 했다”는 말만으로는 안 통한다 — 증거를 내야 한다.
- 채점하기 (3단계 평가) — ① 기계검증(lint/test 같은 자동 검사) → ② 의미검증(요구사항을 진짜 만족했나) → ③ 합의검증(여러 모델이 교차 채점). 단계 게이트를 통과해야 합격.
- 스스로 고치기 (reflect 진화) — 채점 결과를 다음 회차의 새 설계도로 변환해 다시 돌린다. 결과가 더 이상 좋아지지 않거나(정체) 충분히 안정되면(유사도 0.95↑) 멈춘다.
핵심 비유 한 줄
“느낌상 준비됐을 때 짓지 말고 수학이 준비됐다 할 때 짓고, 대충 됐을 때 멈추지 말고 안정됐을 때 멈춰라.” — 시작과 끝을 모두 수학적 게이트로 잠근 것이 ouroboros의 정체성이다.
또 하나의 숨은 무기는 **모든 작업을 일기처럼 적어둔다(이벤트소싱)**는 점이다. 컴퓨터를 껐다 켜도 일기장(EventStore)을 다시 읽어 “어디까지 했는지”를 복원하고 이어간다. 이것이 무상태 Ralph 루프의 토대다.
핵심 정리
| 구성 | 정체 | 한 줄 역할 |
|---|---|---|
| 커널 | Python ≥3.12 (약 926파일) | 핵심 로직·이벤트소싱·평가 |
| 라우터 | router/dispatch.py | ooo 명령을 SKILL.md+MCP로 결정적 매핑 |
| 프로바이더 | providers/factory.py | 9개 백엔드 + gjc + LiteLLM 폴백 |
| 영속성 | persistence/event_store.py | 불변 이벤트 적재 → replay/resume |
| MCP 서버 | evolve/evaluate/auto/ralph/qa | 기능을 도구로 노출 |
3-repo OS 스택 & 언어
- 스택: shell(ourocode) · apps(ouroboros-plugins) · kernel(이 리포). “replayable, observable, policy-bound execution contract” 표방.
- 언어: Python(커널) · Rust(
crates/ouroboros-tui보조 TUI) · YAML(Seed·설정) · Markdown(SKILL/agents/commands) · TOML(pyproject·config).
10축 평가 — 강축/주의축만 추려서
- 만점(5) 축: 아키텍처/포지셔닝 · 컨텍스트 엔지니어링 · 툴/확장 · 오케스트레이션 · 상태/영속성 · 철학/차별점 — 코드 근거가 슬로건을 뒷받침(특히 EventStore replay 구조).
- 가드레일/안전 = 3 — 보안등급 MEDIUM, 구현 역할
UNRESTRICTED, 일부 provider soft enforcement. 파괴적 셸 차단막 약함, 샌드박싱은 호스트 위임. - 검증 루프 = 4 — 3단계 게이트는 강하나, 기계검증 명령 기본값이
None이면 skip/pass, consensus도OPENROUTER_API_KEY없으면 단일모델 폴백(환경 의존적). - 자기개선/반복 = 4 — reflect/수렴은 본질적 강점이나 “8+ 종료신호”는 gate+stop 혼합 표현이라 살짝 과장.
- 배포/DX = 4 — 설치·훅·테스트(526개)는 우수하나 README가
routing/·execution/을 말하는데 실제는router/·orchestrator/로 drift.
독창적 아이디어 3선
- Ambiguity 게이팅:
1 - Σ(clarity·weight) ≤ 0.2통과해야만 Seed 생성(greenfield/brownfield 가중치 분리).- typed evidence contract:
evidence_schema.py+verifier.py+claim_term_guard.py가 결합 — “했다”는 말 대신 구조화된 증거를 요구(LLM 없이 결정적 검증). 가장 저평가된 핵심.- ControlContract = OS 시스템콜 패턴: 제어 결정을 검증된 불변 페이로드로 표준화,
is_terminal을 directive에서 파생해 caller 위조 불가.
약점 요약
실행 권한 경계가 느슨함 · 핵심 검증이 환경 의존적 · 임계값(0.2/0.95/30세대)이 LLM 점수 휴리스틱 의존 · 표면 복잡도가 매우 큼 · 세대마다 다수 LLM 호출로 비용/지연 · 문서-코드 drift.
실제 예시
(1) 두 개의 수학적 게이트 — 시작과 끝을 잠그는 코드 개념
# src/ouroboros/evolution/convergence.py (개념 요약)
# 끝 게이트: 온톨로지가 안정되면 멈춘다
def is_converged(history) -> bool:
if similarity(history[-1], history[-2]) >= 0.95: # 유사도 수렴
return True
if detect_period_2_oscillation(history): # 양반주기 진동
return True
if generation >= 30: # 최대 세대
return True
if evolution_count == 0: # evolution gate:
return False # 실제 진화가 0회면 수렴 거부
return stagnation_detected(history)# src/ouroboros/mcp/tools/authoring_handlers.py (개념 요약)
# 시작 게이트: 모호함이 충분히 낮아야 Seed 생성
ambiguity = 1 - sum(clarity_i * weight_i for ...) # 0~1
if ambiguity <= 0.2: # 게이트 통과
create_immutable_seed(answers) # 불변 Seed 박기(2) 증거 계약 — “했다”는 말이 아니라 구조화된 증거를 요구
# src/ouroboros/harness/claim_term_guard.py (개념 요약)
# deliver 주장의 key=value term이 인용 증거에 실재하는지 LLM 없이 결정적 검증
for term in claim.terms: # 예: status=passed, file=app.py
if term not in cited_evidence: # 증거에 없으면
reject(claim) # 환각으로 간주, 거부(3) 설치 — curl 원커맨드
# 로컬 우선 설치 (pip/uv/pipx extras 도 지원)
curl -fsSL https://ouroboros.ai/install.sh | sh
ooo --help # 결정적 router 진입점요약 & 셀프체크
3줄 요약
- ouroboros는 인터뷰→불변 Seed→실행→3단계 평가→reflect 진화를 반복하는 이벤트소싱 기반 Agent OS다.
- 시작은 Ambiguity≤0.2, 끝은 Similarity≥0.95라는 두 수학적 게이트로 잠그고, 모든 상태를 불변 이벤트로 적재해 replay/resume한다.
- 진짜 차별점은 소크라테스 인터뷰가 아니라 LLM 자기보고를 typed evidence contract로 바꾸는 실행 경계다.
스스로 답해보기
- Q1. ouroboros가 “느낌”이 아니라 “수학”으로 시작·종료를 결정한다는 말은 구체적으로 어떤 두 수식/임계값을 가리키는가?
- Q2. “3단계 평가가 강하다”는 평가가 환경 의존적으로 헐거워질 수 있는 두 가지 경우는?
- Q3. claim_term_guard가 막으려는 것은 무엇이며, 왜 LLM 없이도 결정적으로 검증이 가능한가?
연결
기능별 분해 노트(번호순) — 각 기능을 코드 근거와 함께 분해:
- OB_10_entrypoint-cli-and-ooo-command-routing — 진입점/CLI와
ooo커맨드 라우팅: 자연어·명령을 결정적 router로 스킬/도구에 매핑. - OB_20_spec-engine-seed-and-double-diamond — 스펙 엔진: 소크라테스 인터뷰→Ambiguity 게이트→불변 Seed 계약(Double-Diamond).
- OB_30_event-sourcing-and-projection-readmodel — 이벤트소싱 저장소와 Projection 읽기모델: 전 상태를 불변 이벤트로 적재·replay.
- OB_40_orchestrator-execution-loop — 오케스트레이터 실행 루프: Seed→프롬프트→실행, 병렬·의존성 스테이지·증거 검증.
- OB_50_provider-adapters-and-backend-neutral-runtime — 멀티 백엔드 프로바이더 어댑터: 9개 CLI + gjc/LiteLLM 폴백으로 런타임 중립화.
- OB_60_mcp-server-tools-and-subagents — MCP 서버: 도구 정의·노출과 Subagent 디스패치(evolve/evaluate/auto/ralph/qa 등).
- OB_70_extension-points-hooks-skills-commands — 확장점: Hooks / Skills / Slash-Commands 형식과 자동 디스커버리.
- OB_80_guardrails-sandbox-permissions-plugin-firewall — 가드레일: 샌드박스 클래스·역할별 권한 번역·플러그인 방화벽.
- OB_90_evolutionary-loop-drift-and-audit-ledger — 고유기능: 진화(reflect) 루프·수렴/드리프트 게이트·감사 원장(provenance/lineage).
관련 인덱스: _분석축_루브릭 · HOME · _비교매트릭스
핵심 파일(근거)
/mnt/d/6study/_소스레포/ouroboros/README.md·project-context.md·pyproject.tomlsrc/ouroboros/evolution/reflect.py·convergence.pysrc/ouroboros/evaluation/pipeline.py·mechanical.py·consensus.py·trigger.pysrc/ouroboros/persistence/event_store.pysrc/ouroboros/core/control_contract.py·security.pysrc/ouroboros/orchestrator/policy.py·parallel_executor.py·coordinator.py·evidence_schema.py·verifier.pysrc/ouroboros/harness/claim_term_guard.py·deliver_gate.pysrc/ouroboros/router/dispatch.py·providers/factory.pysrc/ouroboros/mcp/tools/authoring_handlers.py·scripts/keyword-detector.py·hooks/hooks.json
Claude ↔ Codex 교차검증 (메타검증 보존)
Codex가 실제 코드를 직접 확인(
rg, 파일 라인 인용)해 Claude 초안의 과장·낡은 설명을 정정했다. 불일치 = 학습 포인트.
- 사실 오류 정정: Python 파일 수 “383개”→실제 926개(
rg --files -g '*.py') · 구조 drift(routing/·execution/→실제router/·orchestrator/) · “항상 lint/build/test” 과장(기계검증 기본값None→skip/pass,mechanical.py:67-71,286) · “multi-model consensus 무조건” 오류(키 없으면 단일모델 폴백,consensus.py:252-295) · deliver gate는 AC 의미를 바꾸지 않는 read-only bridge(deliver_gate.py:4,139,256).- 빠뜨린 포인트: provider에
gjc+LiteLLM 폴백(factory.py:265-292) · 역할별 capability/sandbox 정책(구현=UNRESTRICTED, 인터뷰/평가=READ_ONLY,policy.py) · 병렬=dependency stage+충돌 리뷰+evidence 검증 · 인터뷰 completion guard가 user/safe-default provenance를 봄(authoring_handlers.py:234).- 점수 보정 수용: 가드레일 4→3, 검증 루프 5→4, 자기개선 5→4, 배포/DX 5→4, 나머지 6축 5 유지.
- 가장 저평가된 핵심: “Socratic interview”가 아니라 LLM 자기보고를 typed evidence contract로 바꾸는 실행 경계(evidence_schema + verifier + claim_term_guard).