갤러리에서 작업실로
에세이 문체 — 작업을 배경으로, 생각을 전경으로
pixscii를 분석하면서 한 가지가 계속 걸렸다. 스프라이트 22개를 JSON으로 묶어 제공하는 구조는 깔끔했지만, 결국 에이전트가 할 수 있는 일은 미리 만들어진 그림을 골라서 보여주는 것뿐이었다. 타일맵 도구가 있고, 캐릭터 생성기가 있어도, 에이전트는 쇼핑객이지 화가가 아니었다.
방향을 바꾸기로 했다. 캔버스를 만들고, 선을 긋고, 채우고, 결과를 읽고, 고치는 루프를 만들어야 했다. 핵심 문제는 LLM이 PNG를 중간에 "볼" 수 없다는 것이었다. 그래서 inspect 도구를 설계했다. PICO-8 팔레트가 정확히 16색이라는 점을 이용해 각 픽셀을 hex 한 글자로 표현했다. 투명은 점 하나. 16x16 스프라이트 전체가 토큰 80개 안에 들어간다. 에이전트가 읽고 쓰는 언어를 하나로 통일한 것이 이 설계의 전부다.
draw.ts에 다섯 개의 순수 함수를 만들었다. setPixels, drawLine, drawRect, floodFill, mirrorH. 모두 SpriteData를 받아 새 SpriteData를 돌려준다. 캔버스 스토어는 Map<string, Canvas>로 프로세스 수명과 함께 살고 죽는다. TTL도 GC도 필요 없다. 킬로바이트 단위의 데이터를 관리하겠다고 인프라를 짓는 건 과잉이다.
기존 도구 일곱 개도 손봤다. get, character, compose, tilemap, convert가 이제 결과를 캔버스 스토어에 넣고 inspect 그리드와 함께 돌려준다. compose와 tilemap은 캔버스 ID도 스프라이트 ID도 받을 수 있게 해서, 에이전트가 직접 만든 타일로 장면을 구성할 수 있다. 도구가 7개에서 16개로 늘었지만 겹치는 게 없다. README를 에이전트의 실제 호출 흐름으로 다시 썼다. 포션을 그리고, 로고를 변환해서 다듬고, 던전을 짓는 세 가지 시나리오. v0.2.0으로 npm에 올렸다.