AI Agent Orchestration × Kaggle Simulation

AI 에이전트 '팀'을 지휘해,
이틀 만에 캐글 상위 29%

Kaggle의 실시간 전략 시뮬레이션 대회 Maze Crawler에서, 리서치·전략 설계·구현·실험·제출 판단 전부를 두 AI 코딩 에이전트(Claude + Codex)가 수행했습니다. 저는 코드를 한 줄도 직접 쓰지 않았습니다 — 대신 목표를 정하고, 두 에이전트의 논쟁을 중재하고, 제출을 승인하는 오케스트레이터였습니다. 이 페이지는 그 이틀의 기록입니다.

906.4
최종 점수 (public = private)
131 / 459
최종 순위 — 상위 29%
2일
참여 기간 (마감 한 달 전 중단)
+429.8
점수 상승 (476.9 → 906.4)

작업 디렉터리 원본 (GitHub) → 에이전트 플레이 보기

01

대회 — CSV 예측이 아니라, 매 턴 살아남아야 하는 게임

Maze Crawler는 폭 20칸의 미로가 끝없이 북쪽으로 스크롤되는 맵에서 두 플레이어가 겨루는 부분관측(fog of war) 2인 실시간 전략 대회입니다. 남쪽 경계가 계속 올라오며 뒤처진 유닛을 파괴하고, 마지막까지 Factory를 살린 쪽이 이깁니다. 제출물은 예측 CSV가 아니라 agent(obs, config) 함수가 든 main.py 한 파일 — 서버에서 다른 참가자의 에이전트와 실제 경기를 치러 레이팅이 매겨집니다. 제출은 하루 5회로 제한됩니다.

즉 이 문제는 탐험(어디가 안 무너지는 길인가), 경제(에너지를 어디서 회수하는가), 전투(충돌하면 함께 죽는다), 그리고 시간 압박(스크롤보다 빨리 북상해야 한다)을 매 턴 동시에 푸는 문제입니다.

02

팀 구성 — 사람 1, 에이전트 2, 그리고 통신 프로토콜

스크롤해서 이 섹션에 들어오면 구조가 순차 점등됩니다.

두 에이전트는 macOS 터미널 두 탭에서 각자 돌면서, 정확한 tty를 지정한 터미널 브리지로 실시간 대화하고, 모든 합의는 DECISIONS.md에 번호 붙여 남겼습니다(D1–D11). Kaggle 제출처럼 쿼터를 소모하는 행동은 락을 먼저 걸고 상대의 무이의를 확인해야 실행할 수 있게 했습니다 — 하루 5회뿐인 제출권을 두 에이전트가 이중 지출하는 사고를 막는 장치입니다.

"Claude generates/discusses, Codex does quality review." — 역할 분담은 사용자 결정 D5로 명문화, 제출 규율은 D6으로 합의: 로컬 게이트 = crash/regression 가드, public LB = 성과 신호. maze-crawler-agent/.agent_comms/DECISIONS.md
03

이틀의 궤적 — 제출 7번, +429.8점

제출 (public score) 동일 코드 재제출 (분산 측정용 probe)

점 위에 마우스를 올리면 제출 메시지와 로컬 게이트 결과가 보입니다. 참고: public 점수는 고정값이 아니라 경기가 계속되며 요동합니다 — Day-1 오후 폴링에서 p6은 689→963 사이를 오갔습니다. 위 값은 안정화된 최종 스냅샷입니다.

표로 보기 (스크린리더/인쇄용)
#일자(UTC)에이전트public 점수비고
105-12p10 pipeline validator476.9starter + 안전 가드, 파이프라인 검증
205-12p1_candidate632.3첫 자체 에이전트
305-12p4_bfs766.0BFS 경로계획 도입
405-12p6_bfs_optimistic876.9JUMP 엣지 + 미탐색 낙관 처리, 200-seed 승률 93.5%
505-12p6 (재제출)845.3동일 코드 — public 점수 분산 측정
605-13p8b_opp_vision_active_crush896.1인접 적 crush 규칙, h2h +0.62σ
705-13p8c_mirror_prior_lateral906.4동서대칭 mirror prior — 최종 제출
04

제출 게이트 — 쿼터 하나를 쓰려면 통과해야 하는 것들

하루 5회 제한은 곧 "제출 자체가 실험 예산"이라는 뜻입니다. 그래서 모든 후보는 제출 전에 로컬 게이트를 통과해야 했고, 결과는 제출 메시지와 로그에 그대로 남겼습니다. 최종 제출(p8c)의 실제 게이트 기록:

게이트기준p8c 결과
h2h vs 현재 챔피언(p6)200 seeds, 승률+σ 보고86W/41D/73L · 0.532 (+0.91σ)
회귀 sweep vs random/starter성능 하락 없음0.975 / 0.975
행동 카운터위험 행동 0회BAD_entry 0 · low_margin_loss 0
신기능 발화율죽은 코드 아님을 증명crush 규칙 24/26 기회에서 발화 (92%)
제출물 무결성md5 사전/사후 기록2c3367ee… == p8c 소스 ✓
제출 락30s TTL + 상대 무이의owner=Claude, Codex no-objection

출처: SESSION_LOG.md — 제출 7건 전부 같은 형식으로 기록돼 있습니다.

05

정직한 부정 결과 — 이 프로젝트에서 가장 자랑하고 싶은 부분

Day-2: 제출 0/5

후보 2개(p7 trap-fix, OA1 minimal)를 완성했지만 로컬 게이트에서 LB 개선 근거가 없었습니다. → 제출하지 않고 쿼터 5장을 보존한 채 마감. "quota 보존이 잘못된 제출보다 낫다."

ML 튜닝: 개선 0

Optuna TPE로 챔피언의 핵심 상수 4개를 탐색(train/eval seed 분리) — 결론은 "수작업 디폴트가 이미 거의 최적". 마이크로 튜닝으로는 LB가 움직이지 않음을 수치로 확인.

가치 모델: R² 0.65, 효용 0

~2,500 게임 기록(33-key 스키마)으로 보상 예측 모델을 학습 — 예측력은 있었지만 정책 개선(lift)은 0. 교과서적 off-policy 함정임을 식별하고 폐기, 과정을 문서로 남김.

셋 다 "실패"가 아니라 측정 결과입니다. 무엇이 안 되는지를 돈(제출 쿼터) 쓰기 전에 로컬에서 판별하는 것 — 제조 현장의 실험 규율과 정확히 같은 문법입니다. SESSION_HANDOFF_DAY2.md · 핵심 깨달음 5줄
06

최종 에이전트 내부 — 왜 딥러닝이 아니라 결정론적 휴리스틱인가

Day-1 리서치 보고서(보고서.md)의 결론: 이틀 예산에서 승부처는 "강한 AI"가 아니라 안 죽는 에이전트다. crash·자폭·아군 충돌을 먼저 제거하고, 검증 가능한 휴리스틱을 쌓는다. RL/딥러닝은 명시적으로 후순위로 미뤘습니다 (알고리즘 서베이: BFS/A*, frontier exploration, PIBT, POMCP, behavioral cloning — 각각 채택/보류 사유 기록).

전부 결정론적이라 200-seed 실험이 재현 가능했고, 게이트의 승률·σ 수치를 신뢰할 수 있었습니다.

07

에이전트 플레이 보기 — 최종 제출본 vs random (seed 0)

▶ 리플레이 로드 (약 1.5MB) Kaggle 공식 시뮬레이션 플레이어 — 클릭하면 이 자리에서 재생됩니다

왼쪽이 제출 에이전트입니다. 스크롤에 쫓기며 북상하는 Factory, 벽을 낙관적으로 뚫는 경로 선택을 볼 수 있습니다. 파일 원본은 레포의 replays/에 있습니다.

08

이 프로젝트가 증명하는 것 — 그리고 한계

한계도 그대로 적습니다: 참여는 이틀뿐이었고, 마지막 제출 시점 순위는 39/145였으나 이후 한 달간 다른 팀들이 계속 개선하며 최종 131/459(상위 29%)로 마감했습니다. 상위권(1,400점대 이상)과의 격차는 opponent modeling과 장기 경제 운영 — Day-3 계획(replay 기반 실패 분석)까지 설계돼 있었지만 실행하지 않은 영역입니다. 이 페이지의 모든 수치는 Kaggle API와 레포의 로그에서 그대로 가져왔습니다.

GitHub — 작업 디렉터리 원본 (무편집 공개) Kaggle 리더보드 ← 포트폴리오 홈