프롬프트 한 번으로 만든 게임 TIDEWRIGHT, 그 말의 실제 조건
타임라인에 프롬프트 한 번으로 만든 게임이라는 말이 돌고, 저장소를 열어야 할지 망설이는 상황일 겁니다. 결론부터 적으면 최초 요청은 하나가 맞고, 그 뒤에 같은 세션 안에서 다듬는 작업이 이어졌습니다.
저는 TIDEWRIGHT 저장소의 README 원문과 거기 실린 세션 수치표를 문장 단위로 대조했습니다. 이 글은 그 표현이 어디까지를 뜻하는지, 그리고 수치가 무엇을 보여주고 무엇을 보여주지 않는지 다룹니다.
프롬프트 한 번이라는 말에는 조건이 붙습니다
README 는 한 번의 요청에서 전부 나왔다고 적은 바로 다음 줄에 조건을 답니다. 최초 요청 이후는 같은 세션 안에서 이어진 다듬기였다는 문장입니다. 두 문장은 붙어 있는데, 말이 옮겨지는 동안 뒤쪽이 먼저 떨어져 나갑니다.
최초 요청의 내용도 winchxyz 의 tidewright 저장소에 그대로 인용돼 있습니다. 영어 원문이고, 요약하면 GPU 위에서 도는 3D 모래성 시뮬레이터를 만들되 복셀 게임은 만들지 말라는 주문입니다.
Create me a fully playable release-ready game. On GPU. Game about sandcastle simulator, where I can build things with sand and etc. I need it in 3D and not a voxel game.
여기에는 장르와 실행 방식, 차원, 금지 사항이 이미 들어 있습니다. 한 단어짜리 지시가 아니라 결과물의 모양을 꽤 좁혀 놓은 주문에 가깝습니다. 이후 같은 세션에서 무엇을 얼마나 고쳤는지는 저장소에 적혀 있지 않습니다.
그래서 정확한 표현은 요청 하나에 같은 세션 안의 후속 작업을 더한 것입니다. 메시지 한 번 보내고 자리를 뜬 것과는 다릅니다.
프롬프트 한 번으로 만든 게임이라는 문구가 퍼질 때 가장 먼저 잘리는 부분이 이 조건입니다. 원문이 공개돼 있어서 어디서 잘렸는지 되짚을 수 있는 사례이기도 합니다.
의존성 0개, 7,145줄이 실제 산출물입니다
산출물은 15개 파일에 7,145줄입니다. 엔진과 라이브러리, 에셋 파일, 빌드 단계가 모두 없고 의존성은 0개로 저장소 문서에 적혀 있습니다. 라이선스는 MIT 입니다.
동작 조건은 좁은 편입니다. WebGL2 의 부동소수점 렌더 타깃 확장 두 개가 필요하고, 사파리는 16 이상이어야 합니다. 성능은 RTX 4070 Laptop 의 High 프리셋에서 프레임당 5~6ms 로 README 에 기록돼 있습니다.
실행은 두 갈래입니다. 저장소를 받아 index.html 을 열면 file:// 에서도 돌고, 저장 기능까지 쓰려면 node server.js 로 로컬 서버를 띄웁니다. 설치 없이 확인하려면 브라우저에서 도는 TIDEWRIGHT 데모를 열면 됩니다.
파일 구성도 그대로 열려 있습니다. 시뮬레이션과 렌더러, 후처리, 사운드가 js 디렉터리 아래로 나뉘어 있고, 설계 값은 content.js 한 곳에 모여 있다고 README 가 밝힙니다.
빌드 단계가 없다는 조건은 확인 비용이 낮다는 뜻이기도 합니다. 소스를 그대로 읽고 그대로 실행할 수 있어서, 주장과 결과물을 맞춰 보기가 쉬운 편입니다. 배포 파이프라인이 끼어 있는 프로젝트와는 다릅니다.
토큰 9억 4,320만 중 95%가 캐시 읽기입니다
세션 기록은 README 맨 아래 표에 있습니다. 총 토큰 9억 4,320만 가운데 프롬프트 캐시 읽기가 9억 80만이고, 모델이 직접 생성한 토큰은 261만입니다. 캐시 읽기가 전체의 95%를 차지합니다.
항목을 하나씩 보면 시간과 토큰이 어디로 갔는지가 드러납니다. 저장소가 공개한 값은 아래와 같습니다.
| 항목 | 값 |
|---|---|
| 모델 | Claude Opus 5 |
| 벽시계 시간 | 7시간 47분 |
| 실제 작업 시간 | 6시간 45분 |
| 어시스턴트 턴 | 2,596 |
| 도구 호출 | 1,680 |
| 모델이 생성한 토큰 | 261만 |
| 프롬프트 캐시 읽기 | 9억 80만 |
| 총 토큰 | 9억 4,320만 |
| 코드 | 15개 파일 7,145줄 |
먼저 볼 칸은 총 토큰이 아니라 생성 토큰 261만입니다. 실제로 쓰인 글자의 양은 이쪽이고, 나머지는 같은 맥락을 반복해서 다시 읽은 몫입니다. 두 값은 350배 넘게 벌어집니다.
긴 단일 세션은 턴마다 코드베이스 전체를 다시 읽습니다. README 도 그 재읽기가 이 규모를 한 대화 안에 붙들어 두는 조건이라고 설명합니다. 캐시 비율이 높다는 건 세션이 길고 맥락이 컸다는 신호에 가깝습니다.
벽시계 7시간 47분과 실제 작업 6시간 45분은 한 시간 넘게 차이 납니다. 그 차이가 어디서 났는지는 저장소에 적혀 있지 않아, 두 값을 그대로 둡니다.
신규 단일 프로젝트라 조건이 가장 유리했습니다
프롬프트 한 번으로 만든 게임이 보여주는 범위는 여기까지입니다. 의존성이 없고 처음부터 새로 시작하는 단일 산출물이라면, 한 세션에 7천 줄 규모가 나올 수 있다는 사실입니다.
보여주지 않는 쪽이 더 넓습니다. 기존 코드베이스의 제약, 다른 시스템과의 연동, 팀 협업, 몇 년짜리 유지보수는 이 사례에 들어 있지 않습니다.
이를테면 Vault 파드와 PVC 를 지운 뒤 Raft 클러스터를 되살리는 작업은 이미 돌고 있는 상태가 선택지를 정합니다. 만료된 쿠버네티스 인증서를 kubeadm 으로 갱신하는 절차도 같은 쪽입니다.
라이브러리를 쓰는 프로젝트도 조건이 다릅니다. React Router 의 중첩 라우팅처럼 외부 API 의 동작에 맞춰야 하는 코드는, 의존성 0개 프로젝트에서는 생기지 않는 제약을 받습니다.
그래서 이 사례를 옮겨 적용하려면 두 가지를 먼저 물어야 합니다. 새로 시작하는 프로젝트인가, 산출물이 한 덩어리로 닫혀 있는가.
재현하려면 빠진 조건이 하나 더 있습니다
저장소가 밝힌 실행 환경은 모델 이름까지입니다. Claude Opus 5 로 한 세션에 썼다고 README 가 적고 있고, 어떤 추론 노력 설정을 켰는지는 나와 있지 않습니다.
설정을 따지는 이유가 있습니다. Claude Code 문서는 ultracode 를 xhigh 추론 노력과 워크플로 자동 편성을 함께 켜는 설정으로 설명합니다. 이 프로젝트가 그 설정을 썼다는 근거는 저장소에서 찾지 못했습니다.
저장소는 설정 대신 결과를 공개하는 쪽을 골랐습니다. 세션 수치와 코드는 다 열려 있고, 어떻게 시작했는지도 인용돼 있습니다. 빠진 건 그 사이의 조작 기록입니다.
그래서 같은 조건으로 다시 해 보려는 사람에게는 변수가 남습니다. 모델이 같아도 노력 설정과 세션 길이, 요청 이후 개입 방식이 다르면 결과도 달라집니다.
코드 품질과 버그 유무는 이 글에서 판단하지 않습니다. 저는 7,145줄을 읽지 않았고, 저장소 문서와 공개된 수치를 대조했을 뿐입니다.
판단 기준은 직접 플레이해 보고 정합니다
이 글의 근거로 말할 수 있는 범위는 좁습니다. 새로 만드는 의존성 없는 단일 프로젝트라면 참고할 만하고, 운영 중인 팀 저장소는 조건이 다릅니다.
비용과 요금제, 사용한 설정은 저장소에 없어 다루지 않았습니다. 설정 쪽은 Claude Code 의 워크플로 문서에서 확인하는 편이 정확합니다.
가장 빠른 판단 재료는 직접 만져 보는 것입니다. 브라우저에서 모래를 5분만 파 보면 7,145줄이 무엇을 하는지 감이 옵니다.
