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"
왜 나쁜가
- 비용 귀속 불가: 누가 얼마를 썼는지 알 수 없음
- 키 누출 위험: 개인 키가 팀 레포에 유출됨
- 예산 미적용: 개인 한도가 팀에 적용되지 않음
- 감사 불가능: 누가 어떤 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-001 | Echo Chamber | 🔴 Critical | 모델 이종성 강제 |
| AP-002 | Subscription Proxy | 🔴 Critical | LiteLLM 가상 키 |
| AP-003 | Single-Model Critics | 🟡 High | Actor-Critic 분리 |
| AP-004 | Flat Config Hell | 🟡 High | 계층화 설정 + vault |
| AP-005 | Optimistic Completion | 🔴 Critical | 구조화된 증거 보고 |
| AP-006 | God Agent | 🟡 High | 역할 분리 + 병렬화 |
| AP-007 | Unbounded Memory | 🟡 High | TTL + 관련성 만료 |
관련 문서
- 설계 철학 — 이 안티패턴들이 위반하는 원칙
- Echo Chamber Prevention — AP-001의 심층 분석
- Model Family Matrix — 올바른 모델 역할 할당
- Security Gates — AP-002/AP-004 관련 보안