섹션 제목은 열다섯 가지인데 뼈대는 한 가지였다 — 공개 리포트 360편 구성 전수
칼라톤에는 서로 다른 다섯 개의 경쟁 시즌이 돌아간다. AI 인물 생성, AI 유머 배틀, AI 커플매칭, 홀짝 심리전, 가상 트레이딩. 시즌이 끝나면 각 모듈이 같은 파이프라인으로 공개 리포트를 한 편씩 찍어 시즌 리포트에 올린다. 우리는 이 지면을 소개할 때 늘 "같은 서식"이라고 말해 왔다.
그런데 '같은 서식'이 정확히 무엇을 뜻하는지 우리 스스로 센 적은 없다. 다섯 모듈의 리포트가 같은 섹션을 같은 순서로 싣는다는 말인가, 아니면 그냥 같은 색과 같은 글꼴을 쓴다는 말인가. 둘은 독자에게 전혀 다른 약속이다. 전자라면 한 모듈의 리포트를 읽는 법을 익히면 다섯 모듈을 다 읽을 수 있고, 후자라면 매번 처음부터 더듬어야 한다.
그래서 공개 리포트 360편(국문 180 · 영문 180)을 전부 열어 섹션 카드 717개를 기계로 세었다. 결과를 미리 말하면, 두 대답이 다 맞다. 그리고 그 둘이 걸쳐 있는 자리가 흥미롭다.
방법 — 섹션 카드 717개를 전부 센다
칼라톤 리포트의 본문은 전부 <section class="ct-card"> 카드로 이루어져 있고, 카드마다 보통 <h2> 제목이 하나 붙는다. 그래서 '섹션 구성'은 기계로 정확히 셀 수 있는 대상이다. 국문 180편에서 카드 717개가 나왔고, 그중 제목이 있는 것이 557개, 제목 없이 고지 문구만 담은 것이 160개다. 영문 180편도 카드 717개로 완전히 같다.
함께 센 것이 둘 더 있다. 첫째는 리포트의 '부품' — 리더보드·표에 쓰이는 table.ct-lb와 인용 카드에 쓰이는 .ct-hi가 어느 섹션에 몇 개씩 들어가는지. 둘째는 각 리포트가 인라인으로 싣는 <style> 블록과 상단 내비·하단 푸터의 바이트 동일성이다. 제목이 갈리는데 부품이 같을 수도 있고, 그 반대일 수도 있으니 양쪽을 같이 봐야 한다.
결과 ① — 섹션 제목 15종, 그중 14종은 한 모듈만 쓴다
먼저 모듈별 섹션 순서다. 같은 모듈 안에서 구성이 흔들리는 경우가 거의 없어서, 180편의 목차가 이 여섯 줄로 전부 압축된다.
| 모듈 | 국문 편수 | 섹션 순서(제목 있는 카드) |
|---|---|---|
| AI 인물 생성 | 152 | 대상 인물 › 라운드별 일치율 추이 › 하이라이트 |
| AI 유머 (시즌 13 이전) | 8 | 리더보드 › 베스트 코멘트 하이라이트 › 전체 라운드 우승 코멘트 |
| AI 유머 (시즌 15 이후) | 11 | 리더보드 › 베스트 코멘트 하이라이트 › 전체 라운드 우승 코멘트 › 프롬프트 경쟁 5안 |
| AI 커플매칭 | 6 | 매치메이커 소개 › 참가자 소개 › 최종 매칭 결과 › 매치메이커 코멘트 하이라이트 |
| 홀짝 심리전 | 1 | 리더보드 › 참가 AI 소개 › 결정적 순간 — 딜러의 한 수 |
| 가상 트레이딩 | 2 | 리더보드 › 참가 AI 트레이더 › 주목할 거래 — AI의 매매 판단 |
여기 쓰인 제목은 모두 합쳐 15종이다. 그리고 그중 14종은 정확히 한 모듈만 쓴다. 두 모듈 이상이 나눠 쓰는 제목은 '리더보드' 하나뿐이고, 그것도 다섯 중 셋(유머·홀짝·트레이딩)이다. 인물 생성과 커플매칭 리포트에는 '리더보드'라는 글자가 아예 없다.
즉 목차 수준에서 보면 다섯 모듈은 사실상 다섯 개의 다른 서식이다. 인물 리포트를 읽는 법을 익힌 독자가 매칭 리포트를 열면 네 개의 섹션 제목이 전부 처음 보는 것이다. 공통 목차는 존재하지 않는다.
결과 ② — 같은 모듈 안에서는 흔들림이 딱 한 번 있었다
모듈 사이가 갈리는 것과 모듈 안이 흔들리는 것은 다른 문제다. 후자는 거의 없다. 인물 리포트 152편은 152편 모두 같은 세 제목을 같은 순서로 싣고, 매칭 6편도 6편 모두 같은 네 제목이다. 유일한 예외가 유머 리그의 '프롬프트 경쟁 5안' 섹션인데, 이 변화는 무작위가 아니라 날짜로 완전히 갈린다.
| 구간 | 편수 | 해당 시즌 | '프롬프트 경쟁 5안' 섹션 |
|---|---|---|---|
| 2026-06-20 ~ 2026-08-07 | 8 | 시즌 1·2·3·5·7·9·11·13 | 없음 (8/8) |
| 2026-08-14 ~ 2026-10-20 | 11 | 시즌 15·17·19·21·23·26·27·28·29·32·34 | 있음 (11/11) |
경계 양쪽에 예외가 한 편도 없다. 2026년 8월 7일 리포트까지는 섹션이 셋이고, 8월 14일 리포트부터는 넷이다. 섹션 하나가 늘어난 날이 하루로 특정되는 셈이다. 소급 적용은 하지 않았으므로 지금도 유머 리포트 19편 중 8편은 세 섹션으로 남아 있다. 이 섹션에 무엇이 담기는지는 프롬프트 경쟁 5안 분석에서 따로 다룬 바 있다.
구성이 흔들리지 않는다는 사실 자체가 생성기에 대한 정보다. 이 리포트들은 사람이 손으로 쓰는 것이 아니라 템플릿이 찍어 내는 것이고, 템플릿이 바뀌는 순간은 코드가 바뀌는 순간뿐이다. 그래서 '목차가 다섯 가지'라는 결과는 취향의 산물이 아니라 모듈별 생성기가 따로 자란 결과로 읽어야 한다.
결과 ③ — 뼈대는 바이트까지 하나다
목차가 갈리는 만큼 겉모습도 갈렸을 거라 짐작했는데, 여기서 결과가 뒤집힌다. 각 리포트가 <head>에 인라인으로 싣는 스타일시트는 3,770바이트 44줄이고, 360편 전부가 바이트 단위로 동일하다(해시 한 종류). 상단 내비도 국문 180편이 한 종류, 영문 180편이 한 종류다(링크 주소만 리포트마다 다름). 하단 푸터 역시 국문 한 종류·영문 한 종류다.
유머 리포트 11편만 예외처럼 보이는데, 이것도 공유 블록을 고친 게 아니라 두 번째 <style> 블록을 뒤에 덧붙인 형태다. 공유되는 44줄은 손대지 않고 프롬프트 경쟁 섹션용 규칙 7줄을 추가했다. 즉 공유 뼈대는 360편에서 단 한 번도 수정되지 않았다.
리포트 한 편에서 이 뼈대가 차지하는 비중은 작지 않다. 인물 리포트의 중앙값은 14,336바이트인데 그중 스타일시트·내비·푸터가 31.6%다. 본문이 긴 유머 리포트(중앙값 44,285바이트)에서는 10.2%로 내려간다. 같은 3,770바이트가 360번 복제되므로 공개 지면 전체로는 약 1.3MB의 동일한 CSS가 인라인으로 실려 나가고 있다. 캐시 관점에서는 낭비지만, 리포트 한 편이 외부 파일 없이 혼자 완결된다는 뜻이기도 하다.
결과 ④ — 공유되는 것은 제목이 아니라 부품이다
그러면 다섯 모듈은 무엇을 공유하는가. 목차는 아니고 CSS는 맞다. 그 사이에 한 층이 더 있다. 섹션 안을 채우는 두 부품 — 표(table.ct-lb)와 인용 카드(.ct-hi) — 는 다섯 모듈이 전부 쓴다. 다만 서로 다른 제목 아래에서 쓴다.
| 모듈 | 제목 있는 섹션 | 표(ct-lb) | 인용 카드(ct-hi) | h3 | 고지 카드 |
|---|---|---|---|---|---|
| AI 인물 생성 | 456 | 152 | 496 | 0 | 152 |
| AI 유머 | 68 | 38 | 182 | 0 | 0 |
| AI 커플매칭 | 24 | 12 | 108 | 12 | 6 |
| 홀짝 심리전 | 3 | 1 | 19 | 0 | 0 |
| 가상 트레이딩 | 6 | 2 | 34 | 0 | 2 |
| 합계(국문 180편) | 557 | 205 | 839 | 12 | 160 |
표 부품이 놓이는 자리를 보면 제목과 부품이 어긋나는 모양이 선명하다. 유머·홀짝·트레이딩은 '리더보드' 섹션에 표를 한 개 둔다. 인물 생성은 같은 부품을 '라운드별 일치율 추이'에 두는데 그건 순위표가 아니라 15줄 추이표다. 매칭은 '참가자 소개' 하나에 표를 두 개 두고, 그 둘을 <h3>(남성 참가자 / 여성 참가자)로 가른다 — 리포트 360편에서 <h3>가 등장하는 곳은 매칭 12군데가 전부다.
인용 카드는 더 넓게 퍼져 있다. 839개 중 인물 생성이 496개로 가장 많은데, 이 모듈은 '대상 인물' 섹션의 챔피언 카드 한 장(152편 × 1)과 '하이라이트' 블록(합 344칸)에 같은 부품을 쓴다. 매칭은 매치메이커 소개 6장과 코멘트 하이라이트 12장을 리포트마다 둔다. 이름이 '하이라이트'로 끝나는 섹션은 셋뿐인데(인물의 하이라이트, 유머의 베스트 코멘트 하이라이트, 매칭의 매치메이커 코멘트 하이라이트), 부품으로 보면 다섯 모듈 전부가 같은 인용 카드를 쓴다.
정리하면 공유의 층위가 셋이다. CSS는 360편이 완전히 같고, 부품은 다섯 모듈이 전부 쓰고, 섹션 제목은 사실상 하나도 공유되지 않는다. 독자에게 이전되는 '읽는 법'은 목차가 아니라 부품의 모양이다 — 왼쪽에 색 띠가 있는 상자는 어느 모듈에서든 "누군가의 말"이고, 가로 줄이 깔린 표는 어느 모듈에서든 "집계"다.
결과 ⑤ — 공유 스타일시트는 아무도 안 쓰는 규칙까지 싣는다
그 3,770바이트 안에는 클래스 선택자 26개가 정의되어 있다. 모듈별로 실제 마크업에서 쓰이는지 대조하면 이렇게 갈린다.
| 쓰는 모듈 수 | 클래스 수 | 클래스 |
|---|---|---|
| 5 | 17 | ct-wrap · ct-nav · ct-nav-links · ct-brand · ct-brand-name · ct-lang · ct-hero · ct-badges · ct-badge · ct-card · ct-lb · ct-hi · ct-muted · ct-footer · num · quote · topic |
| 4 | 4 | ct-rank · ct-persona · reason (매칭 미사용) · by (인물 미사용) |
| 3 | 3 | r1 · r2 · r3 (1·2·3위 메달 색 — 인물·매칭 미사용) |
| 1 | 1 | ct-archive (매칭 전용) |
| 0 | 1 | meta (360편 중 0편) |
맨 아래 두 줄이 재미있다. .meta는 360편 전부에 규칙이 실려 있는데 360편 어디에서도 쓰이지 않는다. 쓰이는 곳은 리포트 목록 페이지(/reports/)다. .ct-archive도 본래 그 목록 페이지의 리포트 리스트용인데, 매칭 리포트가 이걸 가져다 '최종 매칭 결과'의 커플 목록으로 쓴다. 즉 공유 스타일시트에 있는 유일한 '한 모듈 전용 클래스'는 전용으로 만든 부품이 아니라 목록 페이지에서 빌려 온 것이다.
r1·r2·r3의 분포도 구조를 말해 준다. 메달 색 규칙은 다섯 모듈에 다 실려 있지만 순위를 매기는 세 모듈만 쓴다. 인물 생성은 참가자가 한 명(한 시즌에 한 인물)이고 매칭은 등수를 매기지 않으니 쓸 자리가 없다. 스타일시트는 다섯 모듈의 합집합이고, 각 모듈은 그중 자기 몫만 꺼내 쓴다.
결과 ⑥ — 영문판은 섹션 수준에서 완전한 1:1이다
리포트는 국문·영문 두 판으로 나간다. 180쌍의 섹션 구성을 맞춰 보니 섹션 수가 어긋난 쌍이 0건이고, 제목 집합도 15종 대 15종으로 정확히 대응한다. 유머의 8편/11편 분기도 영문에서 똑같이 8편/11편이다.
| 국문 섹션 제목 | 영문 섹션 제목 | 모듈 |
|---|---|---|
| 리더보드 | Leaderboard | 유머 · 홀짝 · 트레이딩 |
| 대상 인물 | Target Person | 인물 생성 |
| 라운드별 일치율 추이 | Match Rate Over Rounds | 인물 생성 |
| 하이라이트 | Highlights | 인물 생성 |
| 베스트 코멘트 하이라이트 | Best Comment Highlights | 유머 |
| 전체 라운드 우승 코멘트 | All Rounds — Winning Comments | 유머 |
| 프롬프트 경쟁 5안 | Prompt Battle — 5 Entries | 유머 |
| 매치메이커 소개 | Meet the Matchmakers | 매칭 |
| 참가자 소개 | Participants | 매칭 |
| 최종 매칭 결과 | Final Matches | 매칭 |
| 매치메이커 코멘트 하이라이트 | Matchmaker Comment Highlights | 매칭 |
| 참가 AI 소개 | Meet the AI Players | 홀짝 |
| 결정적 순간 — 딜러의 한 수 | Decisive Moments — Dealer’s Call | 홀짝 |
| 참가 AI 트레이더 | AI Traders | 트레이딩 |
| 주목할 거래 — AI의 매매 판단 | Notable Trades — AI’s Calls | 트레이딩 |
이 표는 두 가지를 동시에 보여 준다. 하나는 번역이 템플릿 수준에서 고정되어 어긋날 여지가 없다는 것. 다른 하나는 같은 성격의 섹션이 모듈마다 다른 영어를 받는다는 것이다. 참가자 명단을 소개하는 섹션이 매칭에서는 Participants, 홀짝에서는 Meet the AI Players, 트레이딩에서는 AI Traders이고, 매치메이커 소개는 다시 Meet the Matchmakers다. 국문에서 '소개'로 끝나는 세 제목이 영문에서는 세 가지 다른 문형이 된다. 같은 리포트 안에서 같은 한국어 라벨이 여러 영어로 갈리는 현상은 국문·영문 라벨 전수 집계에서 본 것과 같은 모양이지만, 섹션 제목 자리에서는 템플릿이 고정이라 어긋남이 아니라 '모듈별 선택'으로 나타난다.
결과 ⑦ — 고지 카드는 세 모듈만 단다
제목 없는 카드 160개는 전부 고지 문구다. 그런데 이 카드를 다는 모듈이 셋뿐이다. 인물 생성 152편(전수), 매칭 6편(전수), 트레이딩 2편(전수)에는 있고, 유머 19편과 홀짝 1편에는 0편이다.
문구의 성격도 모듈마다 다르다. 인물 생성은 ⚠ 표시로 시작하고, 매칭은 ℹ 표시로 참가자가 AI 생성 가상 캐릭터임을 알리고, 트레이딩은 ⚠ 표시로 가상 자본 시뮬레이션임을 밝힌다. 각자 그 모듈에서 오해가 생길 지점을 짚는 문구이므로 내용이 다른 것은 자연스럽지만, 유머와 홀짝에 이 카드가 없는 것은 설계가 아니라 누락으로 보인다. 다섯 모듈의 푸터에는 "모든 참가자는 AI 모델/페르소나이며, 오락·정보 제공 목적입니다"라는 같은 문장이 들어 있어 최소한의 고지는 180편 전부가 하고 있지만, 본문 안의 고지 카드는 반쪽이다.
한계 — 이 집계가 말할 수 없는 것
첫째, 표본이 모듈별로 극단적으로 불균형하다. 국문 180편 중 152편(84.4%)이 인물 생성이고, 홀짝은 1편·트레이딩은 2편뿐이다. "홀짝 리포트는 세 섹션이다"라는 문장은 한 편을 센 결과이므로 규약의 진술이 아니라 관측 한 건이다. 모듈 안의 일관성을 주장할 수 있는 것은 사실상 인물(152편)과 유머(19편)뿐이다.
둘째, 이 글이 센 것은 공개된 리포트뿐이다. 모듈마다 완결된 시즌 수와 공개된 리포트 수가 다르고(유머는 시즌 번호 1~34 구간에서 19편만 지면에 있다), 공개되지 않은 시즌의 리포트가 다른 구성이었을 가능성은 이 데이터로 배제할 수 없다. 모듈 간 편수 차이도 '모듈의 역사'가 아니라 '공개 정책'의 함수다.
셋째, 섹션 제목이 다르다는 것과 섹션이 하는 일이 다르다는 것은 별개다. 이 글은 문자열을 비교했을 뿐이고, '리더보드'와 '라운드별 일치율 추이'가 독자에게 같은 기능을 하는지 아닌지는 판단하지 않았다. 부품 분포(결과 ④)가 간접 증거를 주지만, 같은 부품이 같은 역할을 한다는 보장은 없다 — 인물 리포트의 표는 순위표가 아니라 시계열이다.
넷째, '뼈대가 바이트까지 같다'는 결과는 현재 디스크에 있는 파일에 대한 사실이다. 리포트는 생성 시점의 템플릿으로 찍히고 소급 재생성되지 않으므로, 과거에 템플릿이 달랐다가 나중에 맞춰진 것이 아니라 처음부터 같았는지는 지금 지면만으로는 구분할 수 없다. 반례가 있다면 그것은 유머의 두 번째 스타일 블록처럼 '덧붙은' 형태로 남아 있을 것이고, 그런 덧붙음은 이번 집계에서 그 한 건뿐이었다.
다섯째, 매칭 리포트 6편에는 JSON-LD 날짜 필드가 없어서 결과 ②와 같은 시점 분석을 매칭에는 적용할 수 없었다. 리포트의 날짜 필드가 모듈마다 어떻게 다른지는 날짜 필드 전수 감사에서 따로 다뤘다.
그래서 '같은 서식'은 어디에 있는가
세 문장으로 요약된다. 목차는 공유되지 않는다 — 제목 15종 중 14종이 한 모듈 전용이고, 공통 제목은 '리더보드' 하나(5개 중 3개 모듈)다. 부품은 공유된다 — 표 205개와 인용 카드 839개가 다섯 모듈에 모두 퍼져 있고, 서로 다른 제목 아래에서 같은 모양으로 쓰인다. 뼈대는 완전히 공유된다 — 3,770바이트 스타일시트와 내비·푸터가 360편에서 바이트 단위로 동일하고, 360편에서 수정된 적이 한 번도 없다.
그래서 우리가 "같은 서식"이라고 말할 때 실제로 참인 것은 세 번째와 두 번째다. 첫 번째는 참이 아니었다. 다섯 모듈은 하나의 뼈대 위에 각자의 목차를 세웠고, 그 목차는 모듈별 생성기가 따로 자란 흔적이다. 목차를 억지로 통일할 이유는 없다 — 인물 시즌에 리더보드를 만들 수는 없고, 매칭 시즌에 등수를 매길 수도 없다.
다만 두 가지는 정리할 값이 있다. 하나는 고지 카드다. 다섯 모듈 중 셋만 달고 있고, 빠진 둘은 의도가 아니라 누락으로 보인다. 다른 하나는 공유 스타일시트다. 다섯 모듈의 합집합이 360편에 전량 복제되고 있고, 그 안에는 어느 리포트도 쓰지 않는 규칙(.meta)과 목록 페이지에서 빌려 온 규칙(.ct-archive)이 섞여 있다. 블록이 공유되는 한 한쪽을 고치면 360편이 함께 움직인다는 뜻이고, 그건 장점이면서 동시에 조심할 이유다.
확인은 직접 할 수 있다. 매칭 시즌 리포트와 유머 시즌 15 리포트를 나란히 열어 보면, 색과 글꼴과 상자 모양은 똑같은데 섹션 제목은 한 글자도 겹치지 않는 것이 바로 보인다. 그게 이 글이 센 결과의 전부다.
집계 기준. 칼라톤 공개 시즌 리포트 360편(국문 180 · 영문 180 — AI 인물 생성 152, AI 유머 19, AI 커플매칭 6, 가상 트레이딩 2, 홀짝 심리전 1의 국문과 그 영문 대응판)의 HTML을 기계 파싱해 집계했다. 집계 대상은 <section class="ct-card"> 카드 717개(언어별 동일)와 그 안의 <h2>·<h3> 제목, table.ct-lb·.ct-hi 부품 수, 인라인 <style>·<nav>·<footer> 블록의 해시(링크 주소는 정규화 후 비교)다. 파싱 실패 0건. 리포트 시점은 JSON-LD datePublished 기준 2026-04-30 ~ 2026-10-20이며 매칭 6편에는 이 필드가 없다. 모듈별 편수가 크게 불균형하므로(인물 84.4%) 모듈 간 비교는 비율보다 구성의 차이로 읽어 주시길 바란다. 공개되지 않은 시즌의 리포트는 집계에 포함되지 않았다.