게임 자체를 하네스로 만들기: AI 에이전트가 읽을 수 있는 게임 설계
How to engineer an AI harness for game development
TL;DR Highlight
게임을 결정론적·스크린샷 가능하게 만들었더니 에이전트가 반복 수정하기 쉬워졌다
Who Should Read
Claude Code로 게임이나 코드가 아닌 자산이 많은 프로젝트를 만드는데 에이전트가 자꾸 망가뜨려 고민인 개발자
Core Mechanics
- LLM이 게임에 약한 건 구조 문제
- 게임에는 코드가 아닌 자산이 많아 LLM에게는 불투명한 영역이 생긴다.
- 저자는 이것이 게임의 본질이 아니라 컨텍스트 문제라고 본다.
- 컨텍스트가 오염되면 작업이 망가진다
- 세션에서는 이전 메시지가 매번 다시 모델에 전달된다.
- 앞의 나쁜 내용이 이후 작업에 계속 영향을 주므로 좋은 정보만 넣어야 한다.
- 난수 소스를 하나로 고정하기
- 게임 시작 시 시드가 있는 난수 소스를 하나 만들고 모든 비결정적 호출이 이를 쓰게 한다.
- 그러면 에이전트가 같은 상태로 처음부터 반복해서 돌아갈 수 있다.
- 스크린샷 비교는 odiff로 숫자화하기
- 전후 스크린샷 두 장을 그냥 주면 모델이 변화와 진척을 파악하기 어렵다고 저자는 말한다.
- 무료 CLI 이미지 diff 도구 odiff는 차이 이미지와 "85% similar" 같은 수치를 낸다.
- 이 수치를 턴마다 평가 기준으로 쓸 수 있다.
- 저장/불러오기는 처음부터 만들기
- 정확한 상태를 얼마나 쉽게 저장하고 불러오는지가 결정론에 얼마나 가까운지의 척도다.
Community Reactions
- 결정론은 플랫폼 간에 어렵다는 반론
- 고정 난수와 결정론은 이론상 좋지만 실제로는 게임 제작을 크게 제약한다는 의견이 있었다.
- 여러 플랫폼에서 결정론을 유지하는 데서 문제가 심해진다고 했다.
- Thing 구조는 큰 게임에서 한계라는 의견
- 수천 개 Thing과 30개 서브시스템을 프레임 시간 안에 순회하기 어렵다는 지적이 있었다.
- 그래서 ECS나 SOA가 있으며 다른 종류의 하네스가 필요하다고 했다.
- 스크린샷·입력 자동화가 효과적이었다는 경험
- 엔진에 스크린샷과 입력 시뮬레이션 자동 테스트 시스템을 만들었더니 Claude가 이를 잘 써서 게임을 만들었다는 경험이 있었다.
- 그 내용을 엔진 문서에 가이드로 썼다고 한다.
- 에이전트가 직접 계측하게 두었다는 경험
- 1997년 게임을 Claude Code로 현대 환경에서 돌리게 했더니 처음 실행은 30분 만에 됐다고 한다.
- 이후 메모리 주소와 로직을 파악하고 헤드리스 병렬 실행까지 만들었다고 한다.
- 결정론 강요와 아키텍처 설계는 위험하다는 경험
- 게임 개발자라는 댓글 작성자는 AI가 모든 것을 결정론적으로 만들려 해 churn과 버그, 경직성이 생긴다고 했다.
- 핵심 구조는 사람이 잡고 AI는 코드를 쓰게 하라는 의견이었다.
How to Apply
- 게임에 시드 난수 소스 하나 도입하기
- 오늘 프로젝트에서 Random 호출을 검색해 하나의 시드 난수 객체로 모으자.
- 같은 시드로 두 번 실행해 같은 상태가 나오는지 확인하자.
- odiff로 에이전트 평가 루프 만들기
- 수정 전후 스크린샷을 odiff로 비교해 차이 이미지와 유사도 수치를 에이전트에게 주자.
- 지시문에 유사도를 올리는 방향으로 반복하라고 명시하자.
- UI·게임플레이 레이어 토글 추가하기
- UI를 고칠 때는 게임플레이 레이어를 끄고 스크린샷을 찍게 하자.
- 에이전트가 불필요한 시각 정보에 휘둘리지 않게 하자.
- 저장/불러오기를 초기 설계에 넣기
- 새 프로젝트 첫 주에 정확한 상태를 저장하고 불러오는 기능을 구현하자.
- 에이전트가 같은 상태에서 반복 실험하도록 쓰자.
Try It
# Claude Code에 붙여넣기 (원문 방법을 프롬프트로 옮긴 것)
너는 내 게임 프로젝트의 에이전트다. 아래 규칙으로 작업해라.
1. 모든 비결정적 호출이 하나의 시드 난수 소스를 쓰는지 코드에서 찾아 보고해라.
2. 같은 시드로 같은 상태를 재현할 수 있는 저장/불러오기 경로가 있는지 확인해라.
3. 변경 전후 스크린샷을 odiff로 비교해 유사도 수치로 진척을 판단해라.
4. 매 턴 최소한의 변경만 하고 바로 검증해라.
목표: {{수정할 기능 또는 버그}}
스크린샷 명령: {{스크린샷 찍는 방법}}
이어서 해 볼 것: 결과로 나온 비결정 호출 목록을 시드 소스로 바꾸는 작업을 시켜 보자.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓