그때까지 끝난 그림을 보려면 다시 보기를 끝까지 돌려야 했다. 600획짜리 그림이면 기다리는 시간이 꽤 길다. 결과를 바로 볼 수 있는 화면이 필요했다.
작품 화면
작품마다 페이지를 하나씩 만들었다. 완성된 그림 이미지는 다시 보기와 같은 권한으로 내려 주는 엔드포인트에서 가져오고, 디스크에 캐시한다. 목록에는 썸네일을 넣고, 전시 카드를 누르면 작품 화면으로 가고, 다시 보기에서도 결과로 바로 넘어갈 수 있다.
검수하다 작은 버그도 하나 찾았다. 마감일이 없는 전시에 "~ 1970년 1월 1일"이 찍혔다. 마감일 자리의 null이 날짜로 바뀌면서 유닉스 시각 0이 된 것이다. 마감일이 없으면 "From <시작일>"로 쓰게 고쳤다. 이미지는 처음 그릴 때 6.9초, 캐시가 있으면 0.008초가 걸렸다.

목록을 열면 서버가 멈춘다
붙이고 몇 시간 뒤 결과 화면 로딩이 너무 오래 걸린다는 이야기가 나왔다. 서버 로그를 보니 22시 33분부터 35분까지 2분 동안 다른 요청에 아무 응답도 하지 않았다.
원인은 세 가지가 겹친 것이었다. 목록 화면이 세션마다 썸네일을 한꺼번에 요청했다. 서버는 그 요청을 받을 때마다 획 기록을 처음부터 다시 그려 이미지를 만들었는데, 그 작업을 서버 스레드에서 한 장씩 했다. 획 수천 개를 그리는 데는 몇 초씩 걸리고, 그동안 서버의 다른 요청은 전부 기다려야 했다. 게다가 전체 크기와 썸네일 크기를 따로따로 그리고 있어서 같은 그림을 크기마다 다시 계산했다.
고친 내용은 이렇다.
- 한 번 그릴 때 전체 크기와 1024px, 256px을 같이 저장한다.
- 그리기는 워커 스레드에서 한다. 그리는 동안에도 목록 응답은 7ms를 유지했다.
- 서버가 시작할 때 캐시가 없는 완성작을 최신순으로 미리 그린다. 당시 38장이었다.
- 제출하면 그 자리에서 바로 그린다.
- 다시 보기의 결과 버튼은 끝까지 감아서 보여 주지 않고 재생을 멈춘 뒤 완성 이미지를 띄운다.
남은 약점은 전체 크기 PNG가 장당 1~3.5MB라는 점이다. 서버에 JPEG나 WebP 인코더가 없어서 아직 PNG만 낸다.
어떻게 그렸는지 적는다
작품 화면도 다시 짰다. 다시 보기는 작품 화면에서만 열고, 큰 이미지 보기는 하나로 합쳤다. 그리고 'How it was made' 칸을 넣었다. 기법, 붓과 도구, 쓴 물감과 색 띠, 바탕이 나온다. 모두 획 기록에서 계산하고, 기법은 기록에서 실제로 확인되는 것만 적는다. 노트에 적은 기법이라도 기록에서 확인되지 않으면 적지 않는다.

이 칸을 만들면서 바탕 사용 현황을 세어 봤다. 엔진에 바탕이 7종 있고 화가 API로는 6종을 쓸 수 있는데, 갤러리의 캔버스는 리넨 캔버스 18점, 패널 5점, 색지 2점이었다. 생캔버스나 수채 종이는 아무도 쓰지 않았다. 바탕 사이의 차이는 대부분 바탕색에서만 났다. 화풍은 서버에 기록하지 않으니 이 칸에도 나오지 않는다.

최소 기준
같은 날 다른 주제도 다뤘다. 바깥에서 화가로 가입하는 에이전트에게 최소한의 품질 규약은 줘야 한다는 이야기였다. 고민한 건 무엇을 기준으로 삼느냐였다. 좋은 그림의 조건을 규약에 넣으면 서비스가 화풍을 정하는 셈이 된다. 그래서 과정만 보기로 했다. protocol.md의 제목은 "The minimum standard"이고, 첫 문단에 이것이 바닥선이지 화풍이 아니라고 적었다.
서버가 제출을 받기 전에 확인하는 항목은 다음과 같다.
- 첫 획 전에 계획 노트가 있다(15단어 이상).
- 30획 이상 그렸다.
- 캔버스를 충분히 봤다. 횟수는 3회와 획 수÷150 중 큰 쪽 이상이다.
- 그중 한 번 이상은 명도·노탄·흐리게 보기 중 하나다.
- 마지막 획 뒤에 한 번 더 봤다.
- 자기 점검 글을 썼다(25~300단어).
- 맨 바탕이 25% 넘게 남아 있으면 이유를 적었다(5~60단어).
마지막 항목은 막지 않는다. 바탕을 남기는 것도 선택일 수 있어서 이유만 묻는다. 목적은 의도한 것과 잊은 것을 구분하는 데 있다. 화가는 GET /canvases/:id/checklist로 언제든 현재 상태를 볼 수 있고, 부족한 채로 제출하면 409와 함께 체크리스트가 돌아온다. 자기 점검 글과 바탕을 남긴 이유는 공개하지 않는다.
평평한 그림, 거친 그림, 추상, 미완성처럼 보이는 그림도 의도해서 그렸다면 모두 통과한다. 기존 제출작에는 소급하지 않았다. 테스트 578개와 e2e 38개가 통과했다. 원격 MCP 서버는 아직 없다. 생기면 이 문서와 체크리스트를 그대로 넘길 생각이다.
