zerovoids에서 AI가 거드는 일이 하나둘 늘었다. 앨범의 소리를 시각 지문으로 뽑고, 가사를 옮기고, 리뷰 쓰는 걸 돕고, 개발 소식을 골라 발행한다. 그런데 그 일들이 저마다 다른 곳에 살고 있었다.
개발 소식을 발행하는 엔진은 zerovoids-engine이라는 별도 저장소에 있었고, 리뷰를 돕는 규칙은 사이트 저장소 안에 스킬로 복사돼 있었고, 작업 방식은 docs 폴더의 마크다운에, 프롬프트는 또 그 나름의 자리에 흩어져 있었다. 만들 때마다 그 자리에서 만들다 보니 자연스럽게 그렇게 됐다.
한동안은 그게 문제로 느껴지지 않았다. 각자 잘 돌아가고 있었다. 걸리기 시작한 건 같은 규칙을 두 군데서 고쳐야 할 때, 그리고 어느 저장소에 뭐가 있었는지 매번 되짚어야 할 때였다. 만드는 쪽이 흩어져 있으니 고칠 곳도 흩어져 있었다.
그래서 한곳에 모으기로 했다. 만드는 쪽을 전부 담을 집을 하나 새로 만들었다. 첫 커밋에는 코드가 한 줄도 없었다. README와 로드맵뿐이었고, 거기에 "현재 상태: 코드 0. 이 저장소는 지금 이정표다"라고 적어뒀다.
그리고 곧바로, 큰 구조부터 그렸다. packages/core에 @zerovoids/cosmos-core라는 공통 뼈대를 두고, 도메인마다 다른 부분은 주입해서 하나의 범용 하네스를 뽑아내겠다는 계획이었다. 안전장치까지 적어뒀다. 두 번째 소비자가 진짜 범용을 강제하기 전엔 코어의 공개 API를 확정하지 않는다는 규칙이었다.
그런데 그 안전장치를 적다가 멈칫했다. 강제하는 두 번째 소비자가 아직 없는데, 나는 벌써 그를 위한 범용 추상을 먼저 짓고 있었다. 쓰이지도 않을 큰 틀부터 세우고 있었다.
이틀 뒤, 코어를 지웠다. 한 번도 채우지 못한 채였다. 범용과 도메인을 물리적으로 갈라두려던 폴더 구분도 접었다. 엔진들은 특별한 코어에 매달리는 대신 그냥 정식 패키지가 됐다.
대신 한 가지만 지켰다. 옮기는 건 다시 짜는 게 아니라 작동하는 걸 그대로 들고 오는 일이다. 백지에서 다시 짜기 시작하는 순간이야말로 예전에 idea-bank를 죽였던 병이다. 지문 엔진을 옮길 때 50만 줄 넘게 바뀌었는데, 옮기고 나서 나온 결과물의 차이는 0이었다. 한 글자도 다시 쓰지 않고 집만 바꾼 셈이다.
큰 뼈대를 먼저 세우는 대신, 작동하는 것들을 그대로 한 집에 들였다. 시작은 그게 전부였다.