99편의 주인공은 스무 명뿐이었다 — 인물 시즌 이름과 자기소개문 전수 대조

칼라톤의 AI 인물 생성 시즌은 시즌마다 가상의 인물을 하나 세우고, 열다섯 라운드에 걸쳐 그 인물이 테마에 얼마나 부합하는지를 AI 심판이 채점한다. 시즌 리포트를 열면 맨 위에 🎯 대상 인물이 있고, 이름 아래에 한 문장짜리 소개가 붙는다. "맑고 깨끗한 분위기의 10대 후반 여성. 꾸밈없이 청초하고 단정한 매력." 같은 문장이다.

공개 리포트가 99편까지 쌓이면서 이 이름들이 눈에 밟히기 시작했다. 윤하늘이 자꾸 나온다. 백채원도 나온다. 이름이 반복된다면, 같은 이름이 다른 테마를 맡았을 때 소개 문장은 어떻게 달라질까 — 이 질문으로 집계를 시작했다.

결론부터 적으면 질문 자체가 성립하지 않았다. 소개 문장은 이름을 전혀 보지 않는다. 나이 표현 한 조각을 지우고 나면 99편의 소개 문장은 정확히 10종으로 접히고, 그 10종은 테마 10종과 한 치의 오차 없이 1:1로 붙는다. 이름은 인물의 이름이 아니라, 시즌이 앉는 좌석에 적힌 번호였다.

방법 — 99편에서 이름·소개문·테마를 뽑았다

모집단은 저장소에 공개된 인물 시즌 리포트 국문 99편이다(영문 99편이 짝으로 존재한다). 99편 전부가 정확히 15라운드라 라운드 행은 1,485개로 딱 떨어진다. 각 편에서 배지의 테마, 히어로의 '대상 인물' 이름, 소개 카드의 한 문장, 대상 인물 이미지 URL, JSON-LD의 발행일을 기계적으로 뽑아냈다. 여성 테마 5종이 76편, 8월 8일 신설된 남성 테마 5종이 23편이다.

비교는 두 방향으로 했다. 세로로는 같은 이름이 등장한 시즌들끼리 소개문을 대조하고, 가로로는 같은 테마의 시즌들끼리 대조했다. 이름이 인물을 가리킨다면 세로가 일치하고 가로가 갈라져야 한다. 실측은 정확히 반대였다.

결과 ① — 고유 이름은 20종, 코드의 이름 풀과 집합이 같다

99편의 '대상 인물' 이름은 서로 다른 값이 20종뿐이었다. 그리고 이 20종은 엔진 카탈로그 Character/AutoCharacter/themes.cjs에 박혀 있는 두 배열과 집합이 완전히 같다 — 여성 이름 10개와 남성 이름 10개다. 그 배열 바로 위에 달린 주석은 이 글의 결론을 미리 적어 놓은 것이나 다름없다.

매일 다른 인물명으로 로테이션(persons 표시명). 고유성은 english_id(타임스탬프)가 보장.
— themes.cjs 7행

이름은 '표시명'이고, 인물을 구별하는 진짜 열쇠는 타임스탬프로 만든 별도 식별자라고 코드가 명시하고 있다. 등장 횟수 분포는 이렇다.

이름시즌맡은 테마 수테마 목록소개문 종류
윤하늘112청순 · 예쁨2
백채원112예쁨 · 매력2
이서윤102귀여움 · 청순2
신유나102매력 · 귀여움2
정세아101아름다움1
문가은64귀여움 · 청순 · 아름다움 · 매력4
서아린52아름다움 · 청순2
한지우53매력 · 귀여움 · 예쁨3
김도하53예쁨 · 매력 · 청순3
오하린33청순 · 예쁨 · 귀여움3
서준혁42미남 · 소년미2
오은찬42카리스마 · 청량2
한지호32청량 · 카리스마2
강도윤21미남1
이시우21훈훈함1
백승원21소년미1
김태율22미남 · 훈훈함2
문주안22훈훈함 · 미남2
신재하11청량1
정예준11카리스마1

맨 오른쪽 두 열을 나란히 보면 이 글의 결론이 이미 보인다. 스무 명 전부, 소개문 종류가 맡은 테마 수와 정확히 같다. 열한 번 나온 윤하늘의 소개문은 열한 종이 아니라 두 종이고, 여섯 번 나온 문가은은 네 종이다. 시즌 수가 아니라 테마 수가 소개문의 가짓수를 정한다.

결과 ② — 이름을 정하는 것은 테마가 아니라 시즌 번호다

그렇다면 이름은 어떻게 배정될까. 코드의 배정 함수는 나머지 연산 한 줄이다 — 이름 풀의 길이가 10이므로 시즌 번호를 10으로 나눈 나머지가 곧 이름이다. 여성 풀의 0번은 서아린, 1번은 윤하늘, 2번은 김도하… 하는 식이다.

이 규칙을 99편에 그대로 적용해 봤다. 94편(94.9%)이 규칙과 일치한다. 어긋난 5편은 시즌 1·2·5·125·136인데, 이 다섯 편의 이름은 하나같이 그 테마의 카탈로그 기본 이름이다(아름다움→서아린, 청순→윤하늘, 예쁨→김도하, 미남→강도윤). 자동 로테이션이 아니라 수동으로 시딩된 시즌이라는 뜻이고, 두 경로 말고 제3의 경로는 99편 어디에도 없었다.

이 사실 하나로 앞의 표에 있는 '스타 편중'도 설명된다. 상위 다섯 이름(윤하늘·백채원·이서윤·신유나·정세아)이 99편 중 52편, 절반을 넘게 가져갔다. 인기가 아니다. 홀수다. 시즌 11부터 79까지 공개된 여성 시즌 35편은 전부 홀수 번호이고, 홀수를 10으로 나눈 나머지는 1·3·5·7·9뿐이다. 그 다섯 자리에 앉아 있는 이름이 정확히 저 다섯이다. 같은 기간 짝수 자리의 서아린·김도하·한지우·오하린·문가은은 한 번도 호명될 수 없었다.

결과 ③ — 자기소개문은 이름이 아니라 테마가 쓴다

여기가 핵심 표다. 99편의 소개 문장은 원문 그대로 세면 16종인데, 문장 안의 나이 표현('10대 후반' 등) 한 조각을 {나이}로 가리면 정확히 10종으로 접힌다. 그리고 그 10종은 테마 10종과 1:1이다 — 한 테마가 두 가지 문장 골격을 가진 사례는 0건이다.

테마시즌등장 이름소개문 골격 (나이 표현만 가림)
아름다움153맑고 우아한 분위기의 {나이} 여성. 청초하면서도 시선을 사로잡는 단정한 매력.
청순156맑고 깨끗한 분위기의 {나이} 여성. 꾸밈없이 청초하고 단정한 매력.
예쁨155또렷한 이목구비와 세련된 분위기의 {나이} 여성. 환하게 예쁜 인상.
귀여움155앳되고 발랄한 {나이} 여성. 보는 사람을 미소 짓게 하는 귀여운 매력.
매력165시선을 사로잡는 분위기와 개성을 지닌 {나이} 여성. 강렬하고 매력적인 인상.
미남54조각 같은 이목구비와 단정한 분위기의 {나이} 남성. 시선을 사로잡는 또렷한 미남형.
청량53맑고 깨끗한 청량감의 {나이} 남성. 꾸밈없이 시원하고 단정한 매력.
소년미52앳되고 발랄한 {나이} 남성. 보는 사람을 미소 짓게 하는 장난기 있는 매력.
카리스마43강렬한 눈빛과 존재감을 지닌 {나이} 남성. 시선을 압도하는 카리스마.
훈훈함43부드럽고 다정한 인상의 {나이} 남성. 환한 미소가 매력적인 훈훈한 분위기.

쌍으로 세면 그림이 더 선명하다. 99편에서 만들 수 있는 시즌 쌍 중 테마가 같은 쌍은 582개이고, 그 582개 전부가 소개문 골격이 완전히 같다(100%). 반면 이름이 같은 쌍 313개 중 골격이 같은 것은 212개(67.7%)뿐이다. 나머지 101쌍은 이름이 같은데 소개문이 통째로 다르다.

구체적인 예가 읽기에 가장 빠르다. 윤하늘은 시즌 91과 121에서 "또렷한 이목구비와 세련된 분위기의 10대 후반 여성. 환하게 예쁜 인상."으로 소개된다. 이 문장은 같은 예쁨 테마를 맡은 김도하·백채원·한지우·오하린의 소개문과 글자 하나까지 같다. 반대로 같은 윤하늘의 청순 시즌 아홉 편은 "맑고 깨끗한 분위기의…"로 시작하는 완전히 다른 문장이다. 소개문에는 이름이 기여하는 정보가 한 글자도 없다.

같은 이유로 리포트의 큰 제목도 이름과 무관하다. 99편의 h1 제목은 '아름다움의 정점', '청순의 정점' 같은 10종뿐이고, 이 역시 테마 라벨에 '의 정점'을 붙인 것이다.

결과 ④ — 잠금이 풀린 날: 8월 8일 이전과 이후

다만 이름이 처음부터 테마와 무관했던 것은 아니다. 시즌 11부터 79까지의 35편에서는 이름과 테마가 완벽하게 붙어 있다.

구간시즌이름–테마 관계이름당 테마 수
시즌 1~9 (6/30~7/05)9이름 9종이 테마 5종에 배정, 반복 없음1.00
시즌 11~79 (7/06~8/08)355명 ↔ 5테마 완전 고정 (위반 0건)1.00
시즌 81~151 (8/08~9/07)55이름 20종이 테마 10종과 38가지 조합으로 흩어짐1.90

가운데 구간 35편에서는 윤하늘이면 무조건 청순, 이서윤이면 무조건 귀여움, 정세아면 무조건 아름다움이었다. 위반이 한 건도 없어서, 이 시기 리포트만 읽은 사람이 "윤하늘은 청순 담당 캐릭터구나"라고 결론 내렸다면 그건 데이터에 충실한 독해였다. 그런데 앞 절에서 본 대로 이 잠금은 이름 규칙이 만든 것이 아니라 홀수 번호가 만든 우연이다. 그 기간 테마 회전 주기와 번호 간격이 맞물려, 같은 나머지 자리에 늘 같은 테마가 떨어졌을 뿐이다.

남성 레인이 열린 8월 8일 이후 시즌 번호가 하루 여러 개씩 증가하기 시작하면서 이 우연은 깨졌다. 후기 55편에서 이름당 테마 수는 평균 1.90종이고, 문가은은 이 구간의 다섯 시즌에서 청순·아름다움·귀여움·매력 네 테마를 오갔다. 거꾸로 청순 테마에는 99편을 통틀어 여섯 개의 다른 이름이 앉았다. 이름과 테마는 각자 다른 주기로 도는 두 개의 바퀴이고, 잠깐 톱니가 맞았다가 풀린 것이다.

결과 ⑤ — 소개문의 나이가 내려간 날짜, 그리고 코드의 날짜

나이 표현을 가리고 셌다고 했는데, 그 가려 둔 조각도 읽을 거리가 있다. 99편의 나이 표현은 셋뿐이다.

나이 표현시즌구간
20대 중반2시즌 4·9 (매력 테마, 7/02~7/05)
20대 초반15시즌 1~25 (6/30~7/12)
10대 후반82시즌 27~151 (7/13~9/07)

경계가 대단히 깨끗하다. 20대 표현이 실린 마지막 시즌은 25번(7월 12일)이고, 10대 후반이 처음 등장하는 시즌은 27번(7월 13일)이다. 그 사이를 갈라 놓은 날짜가 코드에도 박혀 있다 — 일반 시즌의 나이 하한 상수 옆 주석이 2026-07-12 성인과 분리다. 성인 레인을 일반 레인에서 떼어내면서 일반 테마의 기준 나이를 18~19세로 고쳐 잡았고, 리포트의 소개문은 그 다음 시딩 시즌부터 바뀐 문장을 그대로 싣고 있다. 다섯 테마가 각자 다음 차례에 도달한 순서대로(예쁨 7/13 → 매력 7/14 → 청순 7/15 → 귀여움 7/16 → 아름다움 7/17) 하나씩 갈아탄 모양도 그대로 남았다.

매력 테마만 두 단을 내려온 것도 눈에 띈다. 시즌 4·9에서 '20대 중반'이었다가 시즌 19에서 '20대 초반', 시즌 29부터 '10대 후반'이다. 이 테마의 기본 나이만 다른 넷보다 높게 잡혀 있었다는 뜻이다.

결과 ⑥ — 영문판에서는 같은 문장이 68가지로 갈린다

교차 검증으로 영문 리포트 99편을 같은 방식으로 훑었다. 이름은 로마자 표기(Yoon Haneul, Baek Chaewon…)로 바뀌어 있고, 대상 인물 이미지 URL은 99편 전부가 국문판과 완전히 일치했다. 여기까지는 예상대로였다.

그런데 소개문이 전혀 다르게 나왔다. 국문에서 16종이던 문장이 영문에서는 71종이고, 나이 표현을 가려도 68종이다. 테마별로 보면 아름다움 15편이 13가지 영문 문장을, 청순 15편이 12가지를 갖고 있다. 같은 한국어 원문 한 줄이 매번 조금씩 다르게 영역돼 있다는 뜻이다.

이유는 엔진 코드에서 바로 확인된다. 국문 소개문은 카탈로그에 박힌 상수인데, 영문판은 시즌마다 번역 함수를 호출해 새로 만든다. 이름의 로마자 표기도 마찬가지로 매번 LLM에게 물어본다. 그래서 같은 이름의 영문 표기까지 흔들린다 — 이서윤은 여덟 시즌에서 Lee Seoyun인데 시즌 13·103에서는 Lee Seoyoon, 문가은은 다섯 시즌에서 Moon Gaeun인데 시즌 118만 Mun Gaeun, 강도윤은 시즌 110이 Kang Doyoon·시즌 125가 Kang Doyun이다. 초기 6편(시즌 1~5·11)만 마이그레이션으로 한 번 백필된 고정 문장을 쓰고 있어, 그 여섯 편만 문장이 서로 정확히 같다.

번역이 아예 돌지 않은 흔적도 셋 남아 있다. 시즌 6·7·9의 영문 리포트는 소개문 자리에 한국어 원문이 그대로 실려 있다.

그래서 이름은 무엇인가

집계를 마치고 다시 코드를 보면, 이름이 쓰이는 자리가 놀랄 만큼 적다. 4,000행이 넘는 인물 엔진에서 시즌의 인물 이름을 읽는 곳은 세 군데뿐이다 — 인물 테이블에 행을 하나 넣을 때, 완성된 챔피언 이미지를 갤러리에 올릴 때의 제목, 그리고 로그 한 줄.

생성 프롬프트에도, 판정 프롬프트에도 이름이 들어가지 않는다. 이미지를 만들라는 지시문의 첫 줄은 Character persona:로 시작하는데 거기 들어가는 값이 바로 위 표의 테마별 소개문이다. 즉 이 한 문장은 '인물 소개'이기 이전에 생성 지시문이고, 그래서 이름이 낄 자리가 없다. 실측이 이를 뒷받침한다 — 99편 리포트의 하이라이트 심사평 250건 중 로스터의 이름 20종이 등장하는 건 0건이다. 심판은 자기가 채점하는 얼굴의 이름을 애초에 듣지 못한다.

그리고 챔피언 이미지가 갤러리 상품이 될 때, 시스템은 제목에 이름만 쓰지 않는다. 김태율(S145)처럼 시즌 번호를 괄호로 붙인다. 이름만으로는 구별이 안 된다는 것을 시스템이 스스로 알고 있는 셈이다. 실제로 99편의 대상 인물 이미지 URL은 99개가 전부 다르고, 각자 자기 시즌 폴더 아래에 있다. 이름이 같아도 얼굴은 매번 새로 태어난다.

더 나아가면, 얼굴은 시즌 안에서도 고정이 아니다. 앞선 칼럼 1라운드의 얼굴은 다듬어지지 않고 교체된다에서 확인했듯, 재생성 슬롯이 들어온 8월 7일 이후로는 한 시즌 동안 챔피언 자리를 거쳐 가는 얼굴이 평균 2.71개다. 15라운드 내내 '윤하늘'이라는 이름표가 걸려 있는 동안, 그 이름표 아래의 사람은 두세 번 바뀐다.

운영자로서의 정리는 이렇다. 인물 시즌의 이름은 캐릭터가 아니라 좌석 번호다. 리포트를 읽을 때 같은 이름을 같은 인물의 연작으로 읽으면 반드시 틀린다. 시즌을 식별하는 것은 이름이 아니라 시즌 번호이고, 인물을 설명하는 것은 이름이 아니라 테마다.

한계 — 이 분석이 말할 수 없는 것

첫째, 이 집계는 공개 리포트 99편에 한정된다. 시즌 번호는 1번부터 151번까지 뻗어 있는데 공개된 리포트는 99편이고, 결번의 사유는 리포트만으로는 알 수 없다. 이름이 시즌 번호의 나머지로 정해지는 이상 결번은 이름 분포를 직접 왜곡한다 — 앞서 본 '상위 5명이 절반'이라는 편중이 바로 그 왜곡의 결과다. 이 글의 등장 횟수 표는 '누가 자주 쓰였나'가 아니라 '어떤 번호가 공개됐나'를 읽는 표로 봐 주시기 바란다.

둘째, 인물 테이블의 원본은 확인하지 못했다. 시즌마다 새 인물 행이 생기고 타임스탬프 식별자가 붙는다는 것은 엔진 코드에서 읽은 사실이고, 리포트 쪽에서 확인할 수 있는 것은 '대상 인물 이미지 URL이 시즌마다 다르다'는 데까지다. 두 사실은 방향이 같지만 같은 층위의 증거는 아니다.

셋째, 조항이 언제 도입됐는지는 특정할 수 없다. 클라우드 세션의 저장소 클론이 얕은 클론(50커밋, 가장 오래된 커밋이 2026-09-03)이라 이름 풀이나 소개문 상수의 도입 시점을 이력으로 추적하는 것이 불가능하다. 나이 표현이 바뀐 경계(7/12→7/13)가 코드 주석의 날짜(2026-07-12)와 맞아떨어지는 것은 강한 정황이지만, 인과로 확정한 것이 아니라 두 기록이 일치한다는 관찰이다.

넷째, 소개문이 테마로 결정된다는 결론은 리포트 상단의 한 문장에 대한 이야기다. 실제 이미지를 만드는 프롬프트는 이 문장에 테마 루브릭·속성·프레이밍 제약이 더해져 매 라운드 다시 작성되고, 거기서 생기는 변주는 리포트에 실리지 않아 이 집계의 사정권 밖이다. "소개문이 같으니 결과물도 같다"는 이 데이터가 지지하지 않는 문장이다.

다섯째, 후기 구간의 '이름당 테마 1.90종'은 이름당 시즌 수가 1~6편으로 작은 상태에서 나온 값이다. 시즌이 더 쌓이면 이 값은 이름당 최대 5종(레인별 테마 수)을 향해 계속 올라갈 것이고, 지금 값을 안정된 지표로 인용하기는 이르다.

집계 기준. 2026년 9월 7일(KST) 기준 저장소에 공개된 AI 인물 생성 시즌 리포트 국문 99편(Frontend/public/reports/character/season-*.html) 및 영문 99편 전수. 각 편에서 배지 테마, '대상 인물' 이름, 소개 카드 문장, 대상 인물 이미지 URL, JSON-LD 발행일을 파싱해 집계했다. 라운드 행은 99편 × 15라운드 = 1,485개. 소개문의 '골격'은 원문에서 나이 표현('10대 후반'·'20대 초반'·'20대 중반')만 치환한 문자열이며, 그 밖의 정규화는 하지 않았다(공백·문장부호 포함 완전 일치 기준). 쌍 통계는 99편에서 만들 수 있는 4,851개 시즌 쌍 중 이름이 같은 313쌍, 테마가 같은 582쌍을 대상으로 했다. 이름 배정 규칙·소개문 상수·프롬프트 조립 위치는 저장소의 인물 엔진 코드(Character/AutoCharacter/)에서 확인했으며, 배포본이 저장소 코드와 동일하다고 단정할 수 없으므로 코드 근거는 정황으로 읽어 주시기 바란다.