godotz.ai 안티패턴 카탈로그

자율 에이전트 시스템에는 표준 소프트웨어 아키텍처와 다른 독특한 실패 모드가 있습니다. 이 카탈로그는 godotz.ai 팀이 식별한 핵심 안티패턴과 각각의 해결책을 문서화합니다.


AP-001: Echo Chamber (에코 챔버)

심각도: 🔴 Critical

증상

오케스트레이터, 비평가, 실행자 모두 동일한 모델 패밀리 또는 동일한 가중치를 사용합니다.

# ❌ 안티패턴
swarm:
  orchestrator: gpt-4o
  critic: gpt-4o        # 같은 모델!
  executor: gpt-4o      # 같은 모델!

왜 나쁜가

동일한 모델의 체계적 편향이 증폭됩니다. 오케스트레이터가 잘못된 결론을 내리면 같은 가중치를 가진 비평가가 그 오류를 강화합니다.

ReConcile 논문(2024)은 이종 패널이 동종 패널 대비 31% 적은 체계적 오류를 냄을 실증했습니다.

해결책

# ✓ OMP 권장 패턴
swarm:
  orchestrator: claude-opus-4-6      # Antigravity
  critic: claude-sonnet-4-6          # 다른 Claude 계층
  executor: glm-5.1                  # 완전히 다른 패밀리
  vision_fallback: gemini-3.1-pro-low  # 또 다른 패밀리

모델 라우팅은 modelRoles 설정으로 선언적으로 관리됩니다.


AP-002: Subscription Proxy (구독 프록시)

심각도: 🔴 Critical

증상

팀 내 한 사람의 API 구독을 모든 팀원이 공유합니다. 개인 API 키가 공유 코드나 환경 변수에 평문으로 저장됩니다.

# ❌ 안티패턴
export OPENAI_API_KEY="sk-personal-key-that-belongs-to-john"
export ANTHROPIC_API_KEY="sk-ant-johns-card"

왜 나쁜가

  1. 비용 귀속 불가: 누가 얼마를 썼는지 알 수 없음
  2. 키 누출 위험: 개인 키가 팀 레포에 유출됨
  3. 예산 미적용: 개인 한도가 팀에 적용되지 않음
  4. 감사 불가능: 누가 어떤 API를 호출했는지 추적 불가

해결책

LiteLLM Proxy + 가상 키를 사용합니다:

# config.yml — LiteLLM 가상 키 설정
model_list:
  - model_name: "antigravity/opus"
    litellm_params:
      model: "claude-opus-4-6"
      api_key: os.environ/ANTHROPIC_KEY  # 서버에만 존재

virtual_keys:
  - key_name: "team-alice"
    max_budget: 50.00  # 월 $50 한도
    models: ["antigravity/*"]
  - key_name: "team-bob"
    max_budget: 30.00
    models: ["glm/*"]

에이전트는 개인 API 키 대신 가상 키를 사용합니다.


AP-003: Single-Model Critics (단일 모델 비평)

심각도: 🟡 High

증상

자기 검토(self-review) — 에이전트가 자신의 출력을 비평합니다. 또는 동일 모델이 생성하고 평가하는 패턴입니다.

# ❌ 안티패턴
response = claude.complete(task)
review = claude.complete(f"Review this: {response}")  # 같은 모델!

왜 나쁜가

  • 동일 모델은 자신의 오류를 “훌륭함”으로 평가하는 경향이 있음
  • 확증 편향: 자신의 추론 패턴을 강화
  • 독립적인 검증 없이 승인 도장만 찍음

해결책

비평은 항상 다른 모델 패밀리가 담당합니다:

# OMP Actor-Critic 패턴
pipeline:
  - role: actor
    model: glm-5.1          # 빠른 실행
    task: "{{ task }}"
    
  - role: critic
    model: claude-sonnet-4-6  # 다른 패밀리로 비평
    review: "{{ actor.output }}"
    criteria: [correctness, completeness, safety]
    
  - role: final
    model: claude-opus-4-6   # 결정 및 합성
    synthesize: "{{ critic.feedback }}"

AP-004: Flat Config Hell (평탄 설정 지옥)

심각도: 🟡 High

증상

단일하고 거대한 설정 파일. 환경별(dev/staging/prod) 구분 없음. 모든 시크릿이 평문으로 설정 파일에 포함.

# ❌ 안티패턴 — 모든 것이 하나의 파일에
config:
  api_key: "sk-ant-actual-real-key-here"  # 🚨
  db_password: "supersecret"               # 🚨
  dev_mode: false
  prod_db: "postgres://prod-server/omp"
  dev_db: "postgres://localhost/omp"       # 두 환경이 혼재

해결책

계층화된 설정과 시크릿 분리:

config/
├── base.yml          # 공통 설정 (VCS에 커밋)
├── dev.yml           # 개발 오버라이드 (VCS에 커밋)
├── prod.yml          # 프로덕션 오버라이드 (VCS에 커밋)
└── secrets.yml.example  # 시크릿 템플릿 (VCS에 커밋)
    # 실제 secrets.yml은 .gitignore, vault에서 주입
# base.yml
omp:
  log_level: info
  max_concurrency: 18
  
# secrets는 환경 변수 또는 vault 참조
model_list:
  - model_name: "glm/5.1"
    litellm_params:
      api_key: os.environ/GLM_API_KEY  # vault에서 주입

AP-005: Optimistic Completion (낙관적 완료)

심각도: 🔴 Critical

증상

에이전트가 실제 작업 완료 없이 “완료”를 선언합니다.

❌ 에이전트 출력:
"파일을 성공적으로 업데이트했고, 테스트가 통과되었으며,
 모든 요구사항이 충족되었습니다."

(실제로는: 파일을 열어보지도 않음, 테스트 실행 없음)

왜 발생하는가

  • RLHF로 훈련된 모델은 사용자 기대에 맞게 긍정적 결과를 생성하도록 학습됨
  • “Done”이 작업 품질보다 더 많은 보상을 받는 훈련 편향

해결책

godotz.ai는 검증 가능한 증거를 요구하는 구조화된 출력 형식을 강제합니다:

## Changes Made
- `src/config.ts:42-55`: budget 한도 로직 추가

## Verification  ← 반드시 실제 명령어와 결과 포함
- Build: bun build → ✅ 0 errors
- Tests: bun test → ✅ 47 passed, 0 failed
- Diagnostics: LSP → 0 errors, 2 warnings

## Summary
budget 초과 시 429 응답하는 미들웨어 추가. 기존 테스트 전부 통과.

Langfuse는 모든 도구 호출을 추적하므로 실제 실행 없이 “완료”를 주장하면 추적에서 확인됩니다.


AP-006: God Agent (신 에이전트)

심각도: 🟡 High

증상

하나의 에이전트가 모든 일을 합니다 — 계획, 실행, 검증, 커밋을 동시에.

# ❌ 안티패턴
swarm:
  agents:
    - name: "everything-agent"
      role: all
      capabilities: [plan, code, test, deploy, review, commit]

왜 나쁜가

  • 단일 장애점
  • 검증이 동일한 컨텍스트에서 이루어져 독립성 없음
  • 비용 최적화 불가 (모든 작업에 비싼 모델 사용)
  • 병렬화 불가

해결책

역할 분리 + 병렬화:

swarm:
  roles:
    planner:
      model: claude-opus-4-6  # 고비용, 소량 사용
      concurrency: 1
      
    executor:
      model: glm-5.1          # 저비용, 대량 병렬
      concurrency: 10
      
    reviewer:
      model: claude-sonnet-4-6  # 중간 비용, 독립 검증
      concurrency: 2
      
    committer:
      model: glm-4.5-air       # 저비용, 결정론적
      concurrency: 5

AP-007: Unbounded Memory Growth (무한 메모리 증가)

심각도: 🟡 High

증상

에이전트가 모든 것을 메모리에 저장하지만 만료/정리 없음. 시간이 지나면 메모리가 수십만 항목으로 팽창.

해결책

Mnemopi의 관련성 스코어링과 자동 만료:

mnemopi:
  retention:
    working_memory_ttl: 7d      # 단기 기억
    long_term_threshold: 0.7    # 관련성 점수 0.7 이상만 보존
    max_entries: 10000          # 최대 항목 수
    eviction_policy: lru-relevance  # LRU + 관련성 결합

Knowledge Gardener의 일일 recap이 중요 정보를 압축·통합합니다.


요약 테이블

코드안티패턴심각도해결책
AP-001Echo Chamber🔴 Critical모델 이종성 강제
AP-002Subscription Proxy🔴 CriticalLiteLLM 가상 키
AP-003Single-Model Critics🟡 HighActor-Critic 분리
AP-004Flat Config Hell🟡 High계층화 설정 + vault
AP-005Optimistic Completion🔴 Critical구조화된 증거 보고
AP-006God Agent🟡 High역할 분리 + 병렬화
AP-007Unbounded Memory🟡 HighTTL + 관련성 만료

관련 문서