로그의 숲
← 숲으로 돌아가기

16x16 격자 위의 첫 번째 날

pixscii, longblack-csbot

에세이 문체 — 작업을 배경으로, 생각을 전경으로

pixscii라는 프로젝트를 시작했다. AI 에이전트가 픽셀 아트를 다룰 수 있게 해주는 MCP 서버다. 16x16이라는 격자는 좁은 방 같지만, 막상 그 안에 칼 하나를 세워두면 의외로 넉넉하다. 검색, 렌더링, 캐릭터 생성, 애니메이션, 합성, 타일맵, 이미지 변환까지 일곱 개의 도구를 만들었고, PICO-8 팔레트의 열여섯 가지 색으로 22개의 스프라이트를 찍었다. 칼, 방패, 물약. 풀, 돌, 물. 하트, 커서. 작은 세계를 이루는 데 필요한 최소한의 것들이다.

캐릭터 시스템도 넣었다. 종족 네 가지에 갑옷, 무기, 투구를 조합하면 시드 문자열 하나로 648명의 서로 다른 인물이 태어난다. 같은 이름을 부르면 항상 같은 얼굴이 돌아온다는 점이 마음에 들었다. 처음에는 864가지라고 적어놓았는데, 투구가 세 종류였다. 스켈레톤의 뼈가 살색으로 칠해지는 버그도 있었다. 뼈에 피부를 입히는 건 아무래도 순서가 틀린 일이었다.

스프라이트 품질을 다듬는 작업은 타일 한 장에 풀 한 포기를 심는 것과 비슷했다. 끝이 없다. 아이템 여섯 개와 UI 세 개에 검은 외곽선을 두르고, 열쇠는 색을 둘에서 다섯으로 늘렸다. 활의 곡선을 조이고 시위를 보이게 했다. 엘프는 좀 더 가늘게, 스켈레톤은 갈비뼈가 드러나게 체형을 갈랐다. 팔레트에서 쓰이지 않던 다크퍼플과 라벤더가 물약의 그림자와 치유 이펙트 속에서 제 자리를 찾아갔다. 열여섯 가지 색이란 결국 열여섯 개의 단어 같은 것이어서, 하나도 낭비하고 싶지 않았다.

마지막으로 import와 export CLI를 붙였다. 숫자로만 이루어진 격자를 들여다보며 스프라이트를 편집하는 건, 악보만 읽고 음악을 고치려는 것과 다르지 않았다. 이제 스프라이트를 PNG로 내보내서 그림 도구에서 눈으로 보며 편집하고, 다시 임포트하면 팔레트 양자화를 거쳐 JSON으로 돌아온다. 칼 하나를 내보내고 다시 들여온 뒤 원본과 비교했다. 픽셀이 정확히 일치했다. 번역을 거쳐 돌아온 문장이 한 글자도 빠지지 않은 느낌이었다. 37개 테스트가 통과하고, 빌드가 깨끗했다. 첫째 날치고는 꽤 멀리까지 걸어왔다.

 


 

CS 자동화 봇에 기억을 심었다. 이전까지 봇은 매번 같은 유형의 문의를 처음 보는 것처럼 처리했다. 환불 가능 여부를 판단하고, 정책을 확인하고, 이메일을 쓰는 과정을 처음부터 되풀이했다. 사람이라면 세 번째쯤에는 손이 먼저 움직일 텐데, 이 봇에게는 어제라는 게 없었다.

SQLite의 FTS5를 골랐다. 벡터 데이터베이스를 붙이면 의미 검색이 되겠지만, CS 문의라는 영역은 생각보다 어휘가 좁다. 환불은 환불이고 해지는 해지다. 같은 단어가 반복되는 세계에서는 키워드 검색과 BM25 랭킹이면 충분하다. 별도 서버도, 임베딩 API 호출도 필요 없이 이미 쓰고 있는 세션 데이터베이스 파일 하나에 테이블 두 개를 얹었다.

흐름은 단순하다. 담당자가 승인 버튼을 누르고 모든 작업이 성공하면, 봇이 남겨둔 맥락 요약에서 문의 내용과 처리 결과를 뽑아 저장한다. 다음에 비슷한 문의가 들어오면, 저장된 사례 중 가장 가까운 세 건을 찾아 시스템 프롬프트에 끼워 넣는다. 봇은 그것을 참고하되 강제받지는 않는다. 경험이라기보다는 메모에 가깝다. 일 년이 지나면 자동으로 지워진다. 기억도 유통기한이 있는 편이 건강하다.