점수를 매기는 방법: 23개 검사와 가중치

100점 만점 점수는 하나의 주장인데, 대부분은 반증할 수가 없습니다. 뒤에 방법이 없고, 위에 버전이 없고, 나중에 바뀐 게 내 사이트인지 도구인지 알아낼 방법도 없는 숫자만 나옵니다.

우리 점수는 가중치가 붙은 다섯 개 차원에 걸친 23개 검사로 이루어져 있고, 전부 파일 하나에 들어 있습니다. packages/engine/src/scorer.js입니다. 각 부분이 무엇을 재는지, 얼마짜리인지, 그리고 무엇을 말해 줄 수 없는지 적어 두겠습니다.

다섯 개 차원

접근성 — 30%, 검사 3개. 기계가 애초에 이 페이지를 읽을 수 있는지. JavaScript 없이도 본문이 존재하는지, 본문이 HTML 앞쪽에서 시작하는지, 페이지가 통째로 가져올 만큼 작은지. 가장 무거운 차원입니다. 크롤러가 받는 게 빈 껍데기라면 나머지는 전부 장식이니까요.

AI 발견 가능성 — 25%, 검사 6개. AI 클라이언트가 들어올 수 있는지, 들어와서 길을 찾을 수 있는지. robots.txt가 있는지, AI 검색 봇을 허용하는지, 사이트맵이 있는지, 사이트가 Accept: text/markdown에 응답하는지, llms.txt가 있는지, Content-Signal을 선언했는지.

구조화 데이터 — 20%, 검사 5개. Schema.org/JSON-LD, Open Graph, meta description, 정규 URL, 그리고 <html>lang. 페이지가 무슨 말을 하는지가 아니라 페이지가 무엇인지를 기계에게 알려 주는 부분입니다.

시맨틱 HTML — 15%, 검사 5개. 제목 계층 구조, <article> 또는 <main>, 시맨틱 요소와 div의 비율, 실제로 무언가를 설명하는 대체 텍스트, div 중첩 깊이. 추출 과정이 페이지의 어느 부분이 진짜 본문인지 판단하는 근거가 여기입니다.

콘텐츠 효율 — 10%, 검사 4개. HTML에서 Markdown으로 갈 때의 토큰 감소율, 본문 대 잡음 비율, 페이지 무게, 인라인 스타일. 보내는 것 중 얼마가 실제 내용인가 하는 이야기입니다.

왜 모든 검사가 똑같이 세지 않은가

검사마다 가중치 옆에 근거 등급이 붙어 있고, 가중치를 정하는 건 그 등급입니다.

  • 입증됨 — 모델 제공사가 직접 문서로 밝혔거나, 측정으로 확인됩니다. 23개 중 3개.
  • 그럴듯함 — 추출이 동작하는 방식과 어긋나지 않는 타당한 추론이지만, 어느 제공사도 확인해 준 적이 없습니다. 23개 중 13개.
  • 추측 — 관행은 존재하고 업계도 믿고 있지만, 어떤 봇이 실제로 읽는다는 걸 아무도 보여 준 적이 없습니다. 23개 중 7개.

최종 점수까지 계산해 보면 100점 중 약 32점이 입증된 검사에, 51점이 그럴듯한 검사에, 17점이 추측성 검사에 얹힙니다.

입증된 세 가지는 JavaScript 없이 렌더링된다는 것, robots.txt가 AI 검색 봇을 허용한다는 것, 페이지에 Schema.org 마크업이 있다는 것입니다. 첫 번째는 이 분야에서 근거가 가장 탄탄한 신호로, 주요 AI 크롤러 중 JavaScript를 실행하는 것은 없습니다. 두 번째는 이 판에서 유일하게 진짜로 닫히는 문입니다. 검색 봇을 막으면 그 어시스턴트에서는 그냥 존재하지 않게 됩니다.

반대쪽 끝에는 llms.txt와 Content-Signal이 있습니다. 아주 많은 도메인이 제공하고 있지만 읽는다고 확인해 준 제공사는 없고, Google은 llms.txt가 아무 효과도 없다고 밝혔습니다. 그래도 계속 채점합니다. 증거가 없다는 것이 효과가 없다는 증거는 아니니까요. 다만 llms.txt가 한때 차지하던 차원 내 20%가 아니라 각각 10%입니다. 콘텐츠 효율은 처음부터 끝까지 추측입니다. 검색·검색증강 파이프라인은 모델이 무언가를 보기 전에 Readability 방식 추출을 돌리므로, 깔끔한 HTML이 사 오는 이득은 업계가 짐작하는 것보다 적을 겁니다.

이 재조정이 곧 기준 v2였습니다. v1에서는 "JavaScript 없이 렌더링됨"이 최종 점수의 6%였는데, 어느 제공사도 언급한 적 없는 토큰 감소는 10%를 차지했습니다. 판에서 근거가 가장 탄탄한 검사가 짐작보다 가벼웠던 셈입니다.

기준에는 버전 번호가 붙어 있다

채점기는 RUBRIC_VERSION을 내보내며, 현재는 2입니다. v1은 2026년 2월의 최초 가중치, v2는 2026년 7월의 근거 기반 재조정입니다.

이 번호가 없으면 점수는 재현되지 않습니다. 분석을 돌려서 90이 나옵니다. 여섯 달 뒤에 다시 돌리면 85가 나옵니다. 사이트가 나빠진 걸까요, 우리가 골대를 옮긴 걸까요. 어떤 자로 쟀는지 밝히지 않은 인증서는 아무도 검산할 수 없는 숫자입니다.

그 실수를 우리도 실제로 배포했습니다. 버전은 채점기 안에 존재했고 결과 객체에 실려 다녔지만, 데이터베이스까지는 한 번도 도달하지 못했습니다. 그래서 리더보드는 같은 방식으로 잰 점수인지도 모른 채 점수를 서로 줄 세우고 있었습니다. v1 행이 v2 행 위에, 그 비교에 의미가 있다는 듯이 놓여 있었던 겁니다.

마이그레이션 007_add_rubric_version_to_analyses.js가 그 열을 추가하면서 기존 행 전부의 기본값을 1로 두었습니다. 이 기본값은 추측이 아닙니다. 기존 행은 모두 v2 이전이므로 1이 사실입니다. 또 (rubric_version, score)에 인덱스를 걸어 순위를 하나의 기준으로 한정할 수 있게 했습니다. 까다로운 부분은 시점이었습니다. v2로 첫 분석이 기록되기 전에 들어가야 했고, 그러지 않았다면 새 행들이 조용히 v1을 자처했을 겁니다.

일부러 채점하지 않는 것

사이트가 아니라 한 페이지. 분석 한 번은 URL 하나를 읽습니다. robots.txt, 사이트맵, llms.txt는 사이트 전체의 것이고 나머지는 전부 그 페이지만의 이야기입니다. 나머지가 부실한 사이트라도 잘 만든 페이지 하나면 높은 점수가 나오고, 그게 맞습니다.

모델이 실제로 당신을 어떻게 다뤘는지. ChatGPT가 당신을 인용했는지, Claude가 당신 페이지로 답을 만들었는지, 애초에 언급되기는 했는지 우리는 볼 수 없습니다. 밖에서는 누구도 못 봅니다. 모든 검사는 당신이 내보내는 것의 속성이지, 그것으로 무엇이 만들어졌는지의 속성이 아닙니다.

크롤러가 정말 들어갔는지. AI 봇을 자처하며 탐색했는데 robots.txt는 환영한다고 하고 엣지의 무언가는 돌려보낼 때, 검증된 크롤러가 둘 중 어느 쪽을 만나는지 우리는 모릅니다. 그 검사는 60점에서 상한이 걸립니다. 불합격이 아니라 단서를 단 합격이고, 무슨 일이 있었는지는 상세 문구가 설명합니다. "모른다"를 숫자로 말하는 건 나쁜 방식이니까요.

여기서 당신이 쓴 내용이 쓸 만한지는 전혀 보지 않습니다. 높은 점수는 출발점으로서 좋은 신호입니다. 기계가 그 페이지를 읽을 수 있고, 그게 무엇인지 알아본다는 뜻이죠. 인용되리라는 약속은 아닙니다.

우리 자신에게도 적용합니다

agentready.md는 94/100입니다. 이 숫자는 템플릿에 손으로 적어 넣은 게 아니라 데이터베이스에서 읽어 옵니다. 우리 도메인에 대한 가장 최근 분석이고, 그 인증서로 연결됩니다. 숫자가 움직이면 페이지도 움직입니다. 분석이 없으면 낡은 숫자를 내미는 대신 아무것도 보여 주지 않습니다.

떨어진 적도 있습니다. 몇 달 동안 우리 오리진은 /robots.txt404를 돌려주고 있었고, 그 사이 Cloudflare의 관리형 Content Signals Policy가 엣지에서 200과 함께 우리가 쓴 적 없는 파일을 응답하고 있었습니다. 우리 채점기가 그 200을 읽고 우리에게 합격을 줬던 겁니다. 오리진을 고치고 관리형 파일을 끄자 93에서 90으로 내려갔습니다. 낮은 쪽이 정직한 숫자였습니다. 그 3점은 우리 파일이 아니라 Cloudflare의 파일을 재고 있었으니까요.

점수가 만들어지는 방식 · 다른 사이트들의 점수