date
slug
author
status
tags(최대 3개)
summary
type
thumbnail
category
updatedAt
TL;DR
- 하나의 프롬프트로 세 AI를 동시에 실행합니다. Claude(Master), Gemini(Speed Slave), Codex(Precision Slave)가 역할을 나눕니다.
- 5가지 모드(solo/quick/precise/cross/critical)로 작업 복잡도에 따라 에이전트 조합을 자동 선택합니다.
- Cross-validation: 보안 변경, 프로덕션 배포 같은 고위험 작업은 두 에이전트가 독립적으로 검증합니다.
- 인프라팀을 넘어 Foundation, CRM 등 일부 squad에서 AI guardrail 도입이 시작됐습니다.
- 도입 후 복잡한 작업의 처리 속도가 3배 빨라졌고, 코드 리뷰 품질은 체감상 40% 좋아졌습니다.
도입: Claude 하나로는 부족했다
여러 Claude Code 인스턴스가 서로 context를 공유하며 병렬 작업한다.
그땐 아이디어 수준이었습니다. 그런데 매일 Claude Code를 쓰다 보니 한계가 또렷이 보였습니다.
한계 1 — 속도와 정밀도의 딜레마
"WAF 로그 분석해서 요약해 줘"는 빠르게 처리하면 됩니다. 반대로 "프로덕션 IAM 정책 변경 코드 작성해 줘"는 느리더라도 정확해야 합니다. 하나의 에이전트에게 둘 다 기대하는 건 비효율적이었습니다.
한계 2 — 검증의 부재
지난 글의 Datadog Slack Integration API 사고를 기억하실 겁니다. Claude가 문제없다고 판단한 호출이 전사 알림을 두 번 죽였습니다. 한 에이전트가 작성하고 다른 에이전트가 검증하면 이런 사고를 줄일 수 있지 않을까요.
한계 3 — context window의 물리적 한계
CLAUDE.md 2,100줄 + 정책 파일 26개 + 작업 context. 복잡한 작업에서는 context가 밀려나는 문제가 반복됐습니다. 에이전트를 분리하면 각자의 context를 최적화할 수 있습니다.
그래서 Multi-Agent CLI Architecture를 만들었습니다.

1부: 아키텍처 — Master/Slave 패턴

세 에이전트의 역할은 이렇게 나눴습니다.
Gemini CLI(Speed Slave) 는 속도가 생명인 작업을 맡습니다. 로그 요약, 문서 초안, 대용량 데이터 분석. 45초 timeout 안에 결과를 돌려줍니다.
Codex CLI(Precision Slave) 는 정확도가 생명인 작업을 맡습니다. 코드 변경, 보안 검토, 테스트 작성. 90초까지 허용하는 대신 그만큼 꼼꼼합니다.
Claude(Master) 는 둘을 조율하고 최종 판정을 내립니다.

5가지 실행 모드

Claude Code CLI에서 프롬프트 앞에
#모드 해시태그를 붙이면 됩니다.> #quick WAF 로그에서 최근 1시간 Block된 IP Top 10 분석해줘 > #cross 이 IAM 정책 변경의 보안 영향도 분석해줘 > #critical 프로덕션 ECS 서비스 롤백 계획 수립해줘
Master가 해시태그를 인식하면 내부적으로
ai-delegate.sh를 호출해 해당 모드의 Slave를 자동 실행합니다. 사용자는 스크립트를 직접 만질 필요 없이 평소 Claude Code를 쓰듯 프롬프트만 입력하면 됩니다.자동 승격/다운그레이드
모든 작업에
#cross를 붙일 필요는 없습니다. Master가 위험도를 판단해 모드를 자동으로 바꿉니다.자동 승격 (더 신중하게): solo → cross : 보안 관련 코드 변경 (IAM, SG, 인증) solo → critical: 프로덕션 배포/롤백, 데이터 삭제
자동 다운그레이드 (더 효율적으로): cross → quick : AWS 대량 읽기 조회 (Codex sandbox가 외부 API 호출 불가) cross → solo : SSM 기반 트러블슈팅 (Slave timeout 문제) cross → solo : 대규모 레거시 코드베이스 탐색 (Slave 파일 구조 파악 실패)
이 전환 규칙도 CLAUDE.md에 guardrail로 적혀 있습니다. 3편의 교훈 그대로, 경험을 시스템으로 전환합니다.

2부: 실전 사례 — 멀티에이전트가 빛나는 순간
사례 1: Security Group 전수 검사 (#quick → Gemini)
ISMS 감사 대비로 전체 Security Group의 inbound 규칙에서 0.0.0.0/0이 열린 항목을 점검해야 했습니다.
> #quick sso-prod 프로파일로 모든 Security Group에서 0.0.0.0/0 인바운드가 열린 항목을 찾고, 각 SG가 어떤 리소스에 연결되어 있는지 매핑해줘
Gemini가 15초 만에 답을 냈습니다.
결론: 12개 SG에서 0.0.0.0/0 인바운드 발견 근거: 그 중 8개는 ALB용(정상), 3개는 관리 포트(위험), 1개는 미사용 리스크: sg-xxxxxxxxx (SSH 22번 포트 전체 오픈, 연결 리소스: bastion-legacy) 실행안: 관리 포트 3건 즉시 조치 필요, 미사용 1건 삭제 권장
왜
#quick일까요. AWS API 대량 조회는 Codex sandbox의 네트워크 제한 때문에 timeout이 납니다. Gemini의 --approval-mode yolo는 AWS CLI를 자유롭게 호출할 수 있어 이런 작업에 맞습니다. CLAUDE.md의 다운그레이드 규칙 그대로입니다.cross → quick (다운그레이드): AWS 대량 읽기 조회 (다수 SG/리소스 검증). Codex sandbox 특성상 외부 API 순차 호출이 timeout을 초과하므로 Gemini 단독이 효율적.

사례 2: IAM 정책 변경 교차 검증 (#cross)
특정 Lambda에 S3 + DynamoDB 접근 권한을 추가해야 했습니다. 권한을 과다 부여하면 곧 보안 사고입니다.
> #cross devops-event-site-manager Lambda의 IAM 역할에 S3 devops-event-configs 버킷 읽기 + DynamoDB devops-event-monitoring 테이블 읽기/쓰기 최소 권한 정책을 작성해줘
Gemini(Speed)와 Codex(Precision)가 병렬로 돌았습니다.
Gemini 결과 (25초):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::devops-event-configs", "arn:aws:s3:::devops-event-configs/*" ] }, { "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Query"], "Resource": "arn:aws:dynamodb:ap-northeast-2:xxxxxxxxxxxxx:table/devops-event-monitoring" } ] }
Codex 결과 (55초):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3ReadAccess", "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::devops-event-configs/*" }, { "Sid": "S3ListAccess", "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::devops-event-configs", "Condition": { "StringLike": { "s3:prefix": ["events/*"] } } }, { "Sid": "DynamoDBAccess", "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Query"], "Resource": [ "arn:aws:dynamodb:ap-northeast-2:xxxxxxxxxxxxx:table/devops-event-monitoring", "arn:aws:dynamodb:ap-northeast-2:xxxxxxxxxxxxx:table/devops-event-monitoring/index/*" ] } ] }
Master(Claude)의 판정:
결론: Codex 버전 채택 (3가지 차이점 발견) 근거: 1. S3 ListBucket에 Condition 추가 → Codex가 더 최소 권한 원칙 준수 2. DynamoDB에 GSI index/* 포함 → Gemini가 놓친 부분 3. Sid 명시 → 감사 추적 용이 리스크: Condition의 prefix "events/*"가 실제 키 구조와 맞는지 확인 필요 실행안: Codex 버전 기반으로 prefix 경로만 검증 후 적용
Gemini는 빠르지만 GSI index 접근을 놓쳤고, Codex는 느리지만 Condition까지 챙겼습니다. 한 에이전트만 썼다면 어떤 결과를 받았을지 알 수 없습니다. 두 결과를 나란히 놓고 비교하니 빈틈이 보입니다.
사례 3: 프로덕션 배포 계획 수립 (#critical)
ECS 서비스의 새 버전을 배포해야 했습니다. 이전에 health check 설정 오류로 장애가 난 적 있는 서비스입니다.
> #critical imweb-prod-api ECS 서비스 v2.5.0 → v2.6.0 배포 계획 수립. 이전 장애 이력: 2026-01-15 health check 설정 오류로 5xx 급증. 배포 전/중/후 체크리스트 포함.
#critical은 순차 실행입니다.Step 1: Codex (Precision) — 배포 코드 및 설정 검증 (60초) → health check 경로/간격/임계값 검증 → Task Definition diff 분석 → 롤백 스크립트 생성 Step 2: Gemini (Speed) — 영향도 분석 (30초) → 현재 트래픽 패턴 분석 (Datadog metric 참조) → 배포 최적 시간대 추천 → 의존 서비스 영향 범위 확인 Step 3: Claude (Master) — 최종 종합 (20초) → Codex의 기술 검증 + Gemini의 영향도 분석 통합 → 최종 배포 체크리스트 생성 + Go/No-Go 판정
순차 실행이 중요한 이유가 있습니다. Codex가 먼저 코드를 검증하고, 그 결과를 Gemini가 영향도 분석에 반영하기 때문입니다. 병렬로 돌리면 Gemini는 Codex의 발견(예: health check 경로 변경)을 모른 채 분석하게 됩니다.
실전: #critical로 장애 원인을 3분 만에 찾다
가상 시나리오가 아닙니다. 이 글을 쓰는 도중 실제로 터진 사건입니다.
php_fpm.processes.active 급증 알람이 긴급장애 채널에 떴습니다. 웹 서버 30대의 PHP-FPM 워커가 동시에 포화 상태. Claude Code CLI에
#critical을 입력했습니다.> #critical [장애 쓰레드 URL] 이 장애 쓰레드 분석해서 원인/영향/대응 리포트 작성해줘

critical 모드가 Codex → Gemini → Claude 순으로 돌았습니다.
- Step 1 — Codex(Precision): Slack 쓰레드 수집 + Datadog WAF/nginx 로그 분석
- Step 2 — Gemini(Speed): 트래픽 패턴 분석 + 영향도 산정
- Step 3 — Claude(Master): 종합 판정 + 4-Block Format 리포트




3분 후 결과:
결론: xxxxxx.imweb.me /notice/ 게시판에 AWS Singapore(AS16509) 기반 봇이 대량 크롤링 근거: 20분간 22,065건 요청, 건당 응답시간 44~52초, p99 27초까지 악화 리스크: 봇 차단 시 정상 크롤러(Google 등) 오차단 가능성 실행안: WAF rate-limit /notice/ 경로 + AS16509 IP 대역 정밀 차단
리포트가 장애 쓰레드에 공유되자 동료들의 반응이 이랬습니다.
💬 "와.. 이걸 한 방에 찾은 것도 넘 신기하네유" "와.. 진짜 notice 게시글 대량 크롤링이었으면 article_popular insert 폭발했을듯"

한 에이전트만 썼다면 Slack 수집, Datadog 로그 분석, WAF 로그 조회를 순차로 일일이 요청해야 했을 겁니다.
#critical은 세 에이전트가 각자의 강점으로 분석한 뒤 Master가 종합 판정을 내립니다. 그 덕에 알람 발생 3분 만에 근본 원인과 대응안이 나왔습니다.사례 4: 레거시 PHP 코드베이스 분석 (#cross → solo 다운그레이드)
EC2 위 PHP 레거시 코드에서 특정 설정이 어디서 로드되는지 추적해야 했습니다. 처음엔
#cross로 시도했는데 둘 다 실패했습니다.- Gemini: 파일 구조를 제대로 못 잡아 엉뚱한 경로 제시
- Codex: sandbox 환경이라 SSM으로 서버 접근 불가
그러자 Master가 자동으로
solo로 다운그레이드했습니다.cross → solo (다운그레이드): 대규모 로컬 코드베이스(PHP 레거시 등) 탐색. Slave가 파일 구조 파악에 실패하므로 Master 직접 Grep이 효율적.
Claude가 직접 SSM으로 서버에 붙어
grep -r "config_common" <웹서버 루트 경로>를 돌리고 설정 로딩 체인을 추적했습니다. 5분 만에 해결.⚠️ 멀티에이전트가 늘 좋은 건 아닙니다. 적절한 도구를 적절한 상황에 쓰는 게 핵심이고, 그 판단을 자동화한 것이 다운그레이드 규칙입니다.
3부: 4-Block Format — 일관된 출력의 비밀
Slave든 Master든 모든 결과는 같은 형식으로 나옵니다.
1. 결론: 최종 답변/액션 2. 근거: 선택 이유 3. 리스크: 부작용/엣지케이스 4. 실행안: 다음 단계
이 형식이 중요한 이유는 세 가지입니다. 일관성 — 누가 어떤 모드를 쓰든 같은 구조의 결과를 받아 커뮤니케이션 비용이 줄어듭니다. 의사결정 가속 — 결론만 보면 되고, 더 알고 싶으면 근거를, 위험을 보고 싶으면 리스크를 봅니다. 감사 추적 — postmortem이나 변경 이력에 4-Block을 그대로 붙이면 완전한 기록이 됩니다.
4부: Hub & Spoke — 정책은 하나, 에이전트는 셋
멀티에이전트에서 가장 어려운 문제는 세 에이전트가 같은 규칙을 따르게 하는 것입니다. 우리의 해법은 Hub & Spoke 패턴입니다.
Hub (Single Source of Truth): ~/claude-policies/ ← 실제 정책 파일 30+개 Spoke (AI별 설정): ~/CLAUDE.md ← Master: 정책 + orchestration 규칙 ~/GEMINI.md ← Speed Slave: 속도 최적화 + 정책 참조 ~/.codex/AGENTS.md ← Precision Slave: 정밀 검증 + 정책 참조
Spoke에는 AI 고유 행동 + Hub 정책 참조 방법만 적습니다. 실제 정책은 Hub에서 단일 관리합니다. 그러면 정책을 바꿀 때 Hub만 고치면 세 에이전트에 모두 반영되고, AI별 특성에 맞는 행동만 Spoke에서 조정하며, 정책 충돌을 막을 수 있습니다.
5부: 타 squad로의 확산 — 인프라팀을 넘어서
이게 4편의 가장 중요한 이야기입니다.
인프라팀의 CLAUDE.md와 세션 기록을 본 다른 squad에서 관심이 생기기 시작했습니다. Foundation squad는 PHP 레거시 코드 분석에 guardrail을 쓸 수 있는지 물었고, CRM squad는 TypeScript + React 프로젝트에도 적용 가능한지 물었습니다. 모든 squad가 동시에 시작한 건 아닙니다. 인프라팀이 먼저 구조를 만들고, 관심 있는 squad부터 순차로 합류하는 방식입니다.
ai-guardrails-platform
확산을 체계화하려고
ai-guardrails-platform 레포를 만들었습니다. 핵심은 Claude Code와 Codex를 양쪽 다 지원한다는 점입니다.ai-guardrails-platform/ ├── .claude/ # Claude Code 사용자용 │ ├── CLAUDE.md # 전사 공통 가이드라인 │ ├── ONBOARDING.md # 온보딩 가이드 │ ├── policies/ # 공통 정책 (40+ 파일) │ │ └── squads/ │ │ ├── _template/ # 새 squad 추가용 템플릿 │ │ ├── infra/ # 인프라팀 (SRE/DevOps/Security/DB/Data) │ │ │ └── parts/{sre,devops,security,db,data}/ │ │ ├── foundation/ # Foundation squad (PHP 레거시, 서비스 유지보수) │ │ └── crm/ # CRM squad (TypeScript/Node.js + React/Next.js) │ ├── extensions/multi-agent/ # 멀티에이전트 설정 (GEMINI.md, AGENTS.md) │ ├── memory/ # 공유 메모리 (사고 이력, 피드백) │ └── scripts/ │ ├── setup.sh # 원클릭 셋업 │ └── ai-delegate.sh # 멀티에이전트 orchestrator ├── .codex/ # Codex 사용자용 (동일 구조) │ ├── AGENTS.md │ ├── policies/squads/{infra,foundation,crm}/ │ └── ... └── README.md
.claude/와 .codex/ 두 디렉토리가 거의 동일한 정책을 미러링합니다. 팀원이 Claude Code를 쓰든 Codex를 쓰든 같은 guardrail이 적용됩니다. 새 squad 추가도 간단합니다.# _template을 복사해서 squad명으로 변경 cp -r .claude/policies/squads/_template .claude/policies/squads/my-squad # CLAUDE.md 커스터마이징 후 PR

정책 동기화
인프라팀 정책이 바뀌면
ai-guardrails-platform에 동기화됩니다. CLAUDE.md Quick Command의 정책동기화가 그 역할입니다.| 정책동기화 | 로컬 정책 → ai-guardrails-platform/.claude 동기화 + PR + 병합 | | 정책동기화 미리보기 | diff만 표시 (PR 생성 안 함) |
한 팀의 경험이 다른 팀의 guardrail 템플릿이 됩니다. 인프라팀이 만든 공통 정책(AWS convention, Slack 메시징, Git workflow)은 모든 squad가 바로 쓰고, 각 squad는 자기 도메인에 맞는 정책만 더하면 됩니다.
확산이 만든 변화
- Foundation: PHP 레거시 코드 분석 시 Claude가 과거 도메인/SSL 변경 이력을 자동 참조합니다. context 없이도 "이 도메인은 2024년에 SSL 이슈가 있었으니 주의" 같은 가이드를 줍니다.
- CRM: TypeScript + React + PHP가 섞인 코드베이스에서 레이어별 convention을 CLAUDE.md로 관리합니다. 신규 기능 개발 시 Claude가 기존 패턴을 자동 적용합니다.
가장 의미 있는 변화는 squad가 스스로 PR을 올리기 시작했다는 점입니다. 인프라팀이 일일이 만들어 주는 게 아니라, 각 squad가 자기 도메인의 guardrail을 자발적으로 쌓고 있습니다.

6부: 데이터가 말하는 것
복잡한 작업 처리 시간: Before (solo): ████████████████████████████████████ 35분 (평균) After (multi): ████████████ 12분 (평균, -66%)
보안 관련 코드 리뷰 누락: Before (solo): ████████████████ 월 4건 After (cross): ████ 월 1건 (-75%) 프로덕션 배포 사전 검증: Before: 수동 체크리스트 (15분) After (#critical): 자동 검증 + 체크리스트 (5분, -67%)
Notion 세션 기록 기준, 모드 사용 분포는 이렇습니다.
solo: ████████████████████████████████████████ 62% quick: ████████████████ 18% precise: ████████ 9% cross: ██████ 7% critical: ████ 4%
대부분의 작업은 여전히
solo입니다. 멀티에이전트는 필요할 때만 씁니다. 모든 작업에 세 에이전트를 동원하는 건 오버엔지니어링입니다.
7부: 교훈과 함정
교훈 1 — Slave 자동승인은 필수이자 위험
Slave는 사람의 승인을 기다리면 hang됩니다. 그래서 자동승인 모드로 실행합니다.
# Gemini: 자동 승인 gemini --approval-mode yolo
# Codex: 자동 승인 + 네트워크 접근 codex --dangerously-bypass-approvals-and-sandbox
이건 Slave가 위험한 명령을 실행할 수도 있다는 뜻입니다. 그래서 Master의 Judge 역할이 중요합니다. Slave에게 보내는 프롬프트에는 읽기 전용 작업만 담고, 실제 변경은 Master가 사용자 승인을 받고 실행합니다.
교훈 2 — timeout은 성능 제한이 아니라 안전장치다
45초, 90초, 120초. 이 timeout은 성능 제한이 아니라 가드입니다. Slave가 무한 루프에 빠지거나 예상보다 큰 작업을 시도하면 timeout이 자동으로 멈춥니다. 시간 내에 못 끝내면 Master가 solo로 전환하는 fallback이 항상 있습니다.
교훈 3 — 4-Block Format은 협상 불가
처음엔 Slave가 자유 형식으로 응답하게 뒀습니다. 결과가 들쭉날쭉해 Master의 종합 작업이 비효율적이었습니다. 4-Block Format을 강제한 뒤 Master의 판정 품질이 눈에 띄게 올랐습니다. 구조화된 출력이 곧 구조화된 의사결정입니다.
함정 — 멀티에이전트 맹신
"세 에이전트를 쓰면 무조건 좋다"는 착각입니다. 단순 로그 조회, 파일 읽기/수정, 짧은 질문-답변, SSM 기반 서버 작업은
solo가 더 빠릅니다. 멀티에이전트의 오버헤드(프롬프트 생성, 결과 대기, 종합)가 작업 자체보다 큰 경우가 있습니다. 도구가 문제를 만들지 않도록 조심해야 합니다.결론: AI 에이전트는 오케스트라다
5개월 전, 혼자 Claude Code를 쓰기 시작했습니다. 4개월 전엔 팀 전체가 하나의 CLAUDE.md를 공유했고, 3개월 전엔 15개의 실수가 15개의 guardrail이 됐습니다. 그리고 지금, 세 개의 AI가 하나의 오케스트라로 연주합니다.
돌아보면 이 글은 AI 도구 사용법이 아니었습니다. 개인의 경험이 팀의 시스템이 되고, 팀의 시스템이 조직의 문화가 되는 이야기입니다.

