hrxdev
한국어

만드는 방법

한 명의 개발자, AI 코딩 어시스턴트, 그리고 기계가 검사하는 수많은 규칙.

글: Nick

Prison Life는 저와 Claude Code(Anthropic의 코딩 에이전트)가 함께 작성합니다. 게임이 무엇인지, 어떤 선택지를 고를지는 제가 정하고, 타이핑의 대부분은 어시스턴트가 합니다. 코드를 검토하는 사람은 저와 리뷰용 AI 에이전트뿐이라서, 저는 자동화에 의지합니다. 규칙은 좋은 의도가 아니라 자동 검사와 빌드로 강제됩니다.

작업 위임

메인 Claude Code 세션은 작업을 계획하고, 작업 추적기와 설계 결정 기록, 변경 이력을 관리합니다. 코드는 직접 쓰지 않습니다. 아무리 작은 변경이라도 전문 AI 에이전트에게 넘깁니다. 각 에이전트에게는 역할과 모델을 정해 둔 정의서가 있습니다.

역할모델 등급업무
아키텍처Opus데이터 모델, 틱, 스레드, 경로 탐색, 결정
시뮬레이션 코드Opus시뮬레이션 시스템, 캐릭터 AI, 핫 루프
성능Opus프로파일링, 벤치마크 회귀
리뷰 (읽기 전용)Opusdiff를 검토하며 파일을 편집할 수 없음
클라이언트와 도구SonnetGodot 클라이언트, UI, 도구
테스트Sonnet인수 기준에 따른 테스트
콘텐츠 데이터Sonnet스키마에 따른 JSON 정의
검색, 검사 실행Haiku코드 검색, 검사 실행과 실패 요약

어려운 일은 가장 강력한 모델에게, 반복적인 일은 더 저렴한 모델에게 맡깁니다. 저렴한 AI 에이전트가 검사를 두 번 통과하지 못하면 작업은 한 단계 위로 올라가고, 최상위 등급도 두 번 실패하면 멈추고 저에게 물어봅니다.

‘안 돼’라고 말하는 훅

Claude Code의 훅은 어시스턴트의 동작 전후에 실행되는 스크립트입니다. 제 훅은 세 가지 규칙을 강제합니다.

이 장치들은 실수를 막기 위한 것이지, 작정하고 우회하는 것을 막기 위한 것이 아닙니다. 마음먹고 셸 꼼수를 쓰면 피해 갈 수 있고, 훅 중 하나는 AI 에이전트 안의 빨간불은 보지만 막지는 못합니다(메인 세션의 종료 훅이 그래도 잡아냅니다). 이 점은 숨기지 않고 말씀드리고 싶습니다.

기록된 결정과 검사

결정론적 코어

시뮬레이션은 Godot 참조가 없는 순수한 .NET 라이브러리에 들어 있고, Godot 클라이언트는 그 상태를 읽고 명령을 보내기만 합니다. 코어는 고정된 규칙을 따릅니다. 월드는 명령으로만 바뀌고, 시간은 정수 틱이며, 무작위성은 월드의 시드가 있는 생성기에서만 나옵니다. 같은 시드와 같은 명령 로그는 같은 월드를 만들어야 합니다. 이 규칙들은 검토만이 아니라 컴파일러와 테스트로 검증됩니다. 방법은 개발 일지 #1에서, 월드와 저장, 리플레이는 개발 일지 #2에서 볼 수 있습니다.

시뮬레이션 코어 아키텍처명령은 큐로 들어옵니다. 각 틱은 단계 0(명령, 명령 로그에 기록), 단계 1(고정된 순서의 시스템), 단계 2(틱 종료)를 실행합니다. 명령 로그와, 타일 맵 및 시드가 있는 난수 스트림을 포함한 월드 상태가 상태 해시의 입력이 됩니다. 명령 입력 플레이어, 테스트, 시나리오 명령 큐 Enqueue는 스레드 안전 틱 T (단일 스레드, 정수 시간) 단계 0: 명령 직렬화, (tick, seq) 도장 찍기 검증, 로그에 기록, Apply 거부된 명령도 로그에 남음 단계 1: 시스템 코드에 정해진 고정 순서로 실행 (아직 등록된 것 없음) 단계 2: 틱 종료 구조적 변경 (아직 미사용) 그다음 틱 카운터 + 1 명령 로그 모든 명령과 그 결과 와이어 바이트 + 다이제스트 리플레이 = 시드 + 로그 월드 상태 시드, 틱 타일 맵 (층) 시드에서 나온 RNG 4개: Commands, Needs, Ai, Events 상태 해시 시드, 틱, 맵, RNG 스트림, 로그 다이제스트
현재 존재하는 모습의 시뮬레이션 코어. 아직 시스템도 캐릭터도 없습니다. 월드에는 층이 있는 타일 맵이 있고, 해시는 화면에 그려지는 것뿐 아니라 맵까지 포함합니다.

설계 목표는 초당 20틱에서 최대 1,000명의 수감자와 직원입니다. 이것은 목표일 뿐입니다. 아직 캐릭터가 없어서 벤치마크 러너는 있지만 그 규모로는 아무것도 측정하지 않았습니다.