Kaggle의 실시간 전략 시뮬레이션 대회 Maze Crawler에서, 리서치·전략 설계·구현·실험·제출 판단 전부를 두 AI 코딩 에이전트(Claude + Codex)가 수행했습니다. 저는 코드를 한 줄도 직접 쓰지 않았습니다 — 대신 목표를 정하고, 두 에이전트의 논쟁을 중재하고, 제출을 승인하는 오케스트레이터였습니다. 이 페이지는 그 이틀의 기록입니다.
Maze Crawler는 폭 20칸의 미로가 끝없이 북쪽으로 스크롤되는 맵에서 두 플레이어가 겨루는
부분관측(fog of war) 2인 실시간 전략 대회입니다. 남쪽 경계가 계속 올라오며 뒤처진 유닛을
파괴하고, 마지막까지 Factory를 살린 쪽이 이깁니다. 제출물은 예측 CSV가 아니라
agent(obs, config) 함수가 든 main.py 한 파일 — 서버에서 다른 참가자의
에이전트와 실제 경기를 치러 레이팅이 매겨집니다. 제출은 하루 5회로 제한됩니다.
즉 이 문제는 탐험(어디가 안 무너지는 길인가), 경제(에너지를 어디서 회수하는가), 전투(충돌하면 함께 죽는다), 그리고 시간 압박(스크롤보다 빨리 북상해야 한다)을 매 턴 동시에 푸는 문제입니다.
목표·예산 결정(D1–D6), 전략 논쟁 중재, 제출 최종 승인. 코드는 쓰지 않음.
에이전트 코드 작성, seed sweep 실행, 제출 파이프라인, 리더보드 폴링.
설계 리뷰, 게이트 조건 강제, 제출 전 이의제기. "no-objection"이 있어야 제출.
스크롤해서 이 섹션에 들어오면 구조가 순차 점등됩니다.
두 에이전트는 macOS 터미널 두 탭에서 각자 돌면서, 정확한 tty를 지정한 터미널 브리지로
실시간 대화하고, 모든 합의는 DECISIONS.md에 번호 붙여 남겼습니다(D1–D11).
Kaggle 제출처럼 쿼터를 소모하는 행동은 락을 먼저 걸고 상대의 무이의를 확인해야
실행할 수 있게 했습니다 — 하루 5회뿐인 제출권을 두 에이전트가 이중 지출하는 사고를 막는 장치입니다.
점 위에 마우스를 올리면 제출 메시지와 로컬 게이트 결과가 보입니다. 참고: public 점수는 고정값이 아니라 경기가 계속되며 요동합니다 — Day-1 오후 폴링에서 p6은 689→963 사이를 오갔습니다. 위 값은 안정화된 최종 스냅샷입니다.
| # | 일자(UTC) | 에이전트 | public 점수 | 비고 |
|---|---|---|---|---|
| 1 | 05-12 | p10 pipeline validator | 476.9 | starter + 안전 가드, 파이프라인 검증 |
| 2 | 05-12 | p1_candidate | 632.3 | 첫 자체 에이전트 |
| 3 | 05-12 | p4_bfs | 766.0 | BFS 경로계획 도입 |
| 4 | 05-12 | p6_bfs_optimistic | 876.9 | JUMP 엣지 + 미탐색 낙관 처리, 200-seed 승률 93.5% |
| 5 | 05-12 | p6 (재제출) | 845.3 | 동일 코드 — public 점수 분산 측정 |
| 6 | 05-13 | p8b_opp_vision_active_crush | 896.1 | 인접 적 crush 규칙, h2h +0.62σ |
| 7 | 05-13 | p8c_mirror_prior_lateral | 906.4 | 동서대칭 mirror prior — 최종 제출 |
하루 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건 전부 같은 형식으로 기록돼 있습니다.
후보 2개(p7 trap-fix, OA1 minimal)를 완성했지만 로컬 게이트에서 LB 개선 근거가 없었습니다. → 제출하지 않고 쿼터 5장을 보존한 채 마감. "quota 보존이 잘못된 제출보다 낫다."
Optuna TPE로 챔피언의 핵심 상수 4개를 탐색(train/eval seed 분리) — 결론은 "수작업 디폴트가 이미 거의 최적". 마이크로 튜닝으로는 LB가 움직이지 않음을 수치로 확인.
~2,500 게임 기록(33-key 스키마)으로 보상 예측 모델을 학습 — 예측력은 있었지만 정책 개선(lift)은 0. 교과서적 off-policy 함정임을 식별하고 폐기, 과정을 문서로 남김.
Day-1 리서치 보고서(보고서.md)의 결론: 이틀 예산에서 승부처는 "강한 AI"가 아니라 안 죽는 에이전트다. crash·자폭·아군 충돌을 먼저 제거하고, 검증 가능한 휴리스틱을 쌓는다. RL/딥러닝은 명시적으로 후순위로 미뤘습니다 (알고리즘 서베이: BFS/A*, frontier exploration, PIBT, POMCP, behavioral cloning — 각각 채택/보류 사유 기록).
전부 결정론적이라 200-seed 실험이 재현 가능했고, 게이트의 승률·σ 수치를 신뢰할 수 있었습니다.
왼쪽이 제출 에이전트입니다. 스크롤에 쫓기며 북상하는 Factory, 벽을 낙관적으로 뚫는 경로 선택을 볼 수 있습니다. 파일 원본은 레포의 replays/에 있습니다.
한계도 그대로 적습니다: 참여는 이틀뿐이었고, 마지막 제출 시점 순위는 39/145였으나 이후 한 달간 다른 팀들이 계속 개선하며 최종 131/459(상위 29%)로 마감했습니다. 상위권(1,400점대 이상)과의 격차는 opponent modeling과 장기 경제 운영 — Day-3 계획(replay 기반 실패 분석)까지 설계돼 있었지만 실행하지 않은 영역입니다. 이 페이지의 모든 수치는 Kaggle API와 레포의 로그에서 그대로 가져왔습니다.