diff --git a/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.html b/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.html new file mode 100644 index 0000000..bcf0f87 --- /dev/null +++ b/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.html @@ -0,0 +1,141 @@ + + +원진성형외과 AI Answer Readiness Report v2.0 + + + + +
+
INFINITH AI Discovery · AEO / GEO Audit v2.0
+

AI Answer Readiness

+
원진성형외과
+
성형외과 (강남역) · https://www.k-wonjin.co.kr
+

AI 답변엔진(ChatGPT·Perplexity·Gemini·네이버 AI 브리핑)이 이 병원을 얼마나 읽고, 믿고, 인용할 수 있는지를 실측 신호로 채점한 리포트입니다. 답변 준비도(AEO)와 출처 준비도(GEO)를 각각 100점으로 보고, 확인하지 못한 항목은 점수에서 뺍니다.

+
+
15/ 100AEO 등급 D
45/ 100GEO 등급 C
+
+
25실측 항목 / 36
+
49v1.0 종합 (C)
+
5핵심 발견
+
6실행 항목
+
+
+

실측일 2026-09-08 · 리포트 작성 2026-09-08 · 미검증 11개 항목은 분모에서 제외했습니다. 조건은 마지막 장에 적었습니다.

+
+ +
+
Findings

AI가 지금 원진성형외과를 어떻게 읽는지 정리했습니다

+
+
강점

크롤러 접근은 열려 있습니다. 서버 렌더링이라 AI가 본문을 읽습니다

robots.txt가 AI 검색봇 12종을 모두 허용하고, IIS가 본문을 서버에서 렌더링해 JS 없이도 14,079자를 읽을 수 있습니다. TTFB 0.09초, 초기 HTML 153KB로 가볍습니다. 다만 www 유무에 따라 최종 URL이 갈라지고(정본 미수렴), sitemap이 robots.txt에 선언돼 있지 않습니다.

핵심 과제

연결은 됐지만 병원 자체가 스키마로 정의돼 있지 않습니다

Organization.sameAs 10개로 SNS·지도·버티컬을 잘 묶었고 주소 표기도 한 가지입니다. 그러나 MedicalClinic·Physician 스키마가 없어 주소·전화·진료시간·의료진 17명이 구조화돼 있지 않고, 전화번호는 6종이 섞여 있습니다. 영문 사이트(wonjinbeauty.com)는 hreflang으로 연결되지 않았습니다.

핵심 과제

인용할 문장이 부족합니다. H1도 표도 정의문도 없습니다

메인·시술 페이지에 H1이 없고 HTML 표가 없으며 병원 정의문도 없습니다. 눈매교정(CFS)·트임 페이지에는 수술 시간·마취·실밥·일상 복귀 수치가 텍스트로 있어 인용 구조의 출발점이 될 수 있지만, 쌍꺼풀·눈매교정 나머지 페이지는 수치가 없습니다. 최신 갱신 신호가 2025-02-18(sitemap)로 18개월 전입니다.

보완

유튜브는 강합니다. 736편·누적 3,113만 회

설명형 롱폼(눈성형 관리법·중년 눈성형 비교·지방흡입 QnA 등)이 있어 글의 근거 영상으로 쓸 수 있습니다. 다만 상위 조회 영상의 다수가 브랜드 필름·연예인·전후 형식이라 인용용 정보형 영상은 10편 안팎입니다. 이 채널이 원진의 가장 큰 오픈웹 자산입니다.

보완

이미지 alt 62% 누락, 의료진 경력은 텍스트지만 구조화는 안 됨

메인 이미지 45개 중 28개가 alt 없이 실려 AI가 이미지 내용을 읽지 못합니다. 의료진 17명의 경력은 텍스트로 있어(원장당 12~23줄) Physician 스키마만 붙이면 바로 엔티티가 됩니다. 강남언니·GBP·네이버 플레이스는 이번 자동 채점 범위 밖이라 수동 실측이 남아 있습니다.

+
+
+ +
+
AEO · Answer Readiness

답변 준비도 8개 항목

+

질문을 고르고, 답을 먼저 쓰고, 한 단락으로 완결하고, 결정에 필요한 정보와 다음 행동까지 닿게 하는가.

+ + + +
항목무엇을 보는가점수근거파생된 실측 항목
AEO1질문 수요 충족
사람들이 실제로 묻는 질문에 답하는 페이지가 있는가
0 / 100실측 파생C2 L0
AEO2답변의 직접성
페이지 첫 단락에 답이 먼저 나오는가
0 / 100실측 파생C1 L0
AEO3답변 단위의 자기완결성
한 단락만 떼어내도 누가·어디서·무엇을이 들어 있는가
미검증미검증C8 미검증
AEO4의사결정에 필요한 정보
가격대·시간·회복·조건처럼 결정에 쓰는 정보가 텍스트로 있는가
40 / 100실측 파생C4 L2 · C5 L0
AEO5정보 구조와 가독성
제목이 주제를 서술하고 계층이 논리적인가
0 / 100실측 파생C3 L0
AEO6다음 행동의 명확성
답을 읽은 사람이 무엇을 하면 되는지(예약·전화·방문) 바로 보이는가
미검증미검증
AEO7핵심 답변의 텍스트 추출
답이 이미지가 아니라 텍스트로 존재하고 서버가 렌더하는가
60 / 100실측 파생A3 L3 · F1 L0
AEO8사이트 내 답변 발견
크롤러가 답이 있는 페이지를 찾아갈 수 있는가
47 / 100실측 파생A5 L1 · B6 L2
+ +
GEO · Source Readiness

출처 준비도 8개 항목

+

주장에 근거가 붙어 있고, 누가 책임지는지 보이고, 병원 사실이 표면마다 같고, 갱신·정정 기록이 있으며, 기계가 인용 식별자를 읽을 수 있는가.

+ + + +
항목무엇을 보는가점수근거파생된 실측 항목
GEO1주장과 근거의 일치
수치·수상·효과 주장마다 근거(원문·출처·조건)가 붙어 있는가
미검증미검증
GEO2출처의 적합성과 추적성
인용된 URL이 정본으로 수렴하고 시간이 지나도 같은 곳을 가리키는가
33 / 100실측 파생A4 L1
GEO3전문성과 책임 주체
누가 썼고 누가 의학적으로 책임지는지 텍스트와 스키마로 보이는가
40 / 100실측 파생C7 L2 · B3 L0
GEO4병원 엔티티와 사실의 정합성
이 병원이 누구인지 사이트 안과 밖(강남언니·GBP·플레이스)에서 같은 사실로 확정되는가
63 / 100실측 파생B2 L1 · B4 L3 · B5 L3 · D1 미검증 · D2 미검증 · D4 미검증 · D5 미검증 · D6 L0
GEO5사실의 최신성과 정정
언제 확인한 사실인지 적혀 있고, 틀린 것을 고친 기록이 있는가
33 / 100실측 파생C6 L1
GEO6원천 대비 추가 가치
다른 곳에 있는 문장을 옮긴 것이 아니라 여기서만 얻는 정보(체크리스트·조건 표·실측)가 있는가
미검증미검증
GEO7발행 관계와 투명성
누가 운영하고 누구의 지원을 받는지, 광고와 정보가 구분되는지 밝히는가
미검증미검증
GEO8인용 식별자와 메타데이터 정합성
기계가 읽는 식별자(JSON-LD·메타)가 유효하고 화면 내용과 같은가
67 / 100실측 파생B1 L2
+ +
+ +
+
Category Detail

카테고리별 실측 36개 항목

+
+
A · Access & Crawlability

AI 크롤러 접근성

80 / 100 · 실측 6/7
B · Entity & Structured Data

엔티티 식별·구조화

50 / 100 · 실측 7/7
C · Answer-Ready Content

답변 인용 가능 콘텐츠

25 / 100 · 실측 7/8
D · Off-site Surfaces

AI 인용 표면 확보

53 / 100 · 실측 2/6
E · Measurement

AI 가시성 측정 인프라

0 / 100 · 실측 0/4
F · Technical Hygiene

기술 위생

42 / 100 · 실측 3/4
+
+
+
+

A · AI 크롤러 접근성 AI 검색엔진이 사이트를 읽을 수 있는가. 크롤러 접근이 막히면 나머지 항목은 전부 무효다.

+ + +
ID항목판정실측 근거
A1검색용 AI 봇 허용
배점 5
L3
검색봇 전부 허용 + 200 응답
12개 AI 봇 전부 허용. OAI-SearchBot·PerplexityBot·GPTBot UA로 GET → 전부 200
A2CDN/WAF AI 차단 없음
배점 3
L3
CDN 차단 없음 확인
Server: Microsoft-IIS/10.0 직접 응답, Cloudflare 헤더 없음, AI UA 챌린지 없음
A3서버 렌더링 본문
배점 3
L3
80% 이상 (SSR/정적)
서버 렌더링. JS 미실행 HTML에서 본문 텍스트 14,079자 추출
A4HTTPS·리다이렉트 정합
배점 2
L1
변형 간 200 중복
변형 간 최종 URL 불일치(중복 콘텐츠 위험): ['https://k-wonjin.co.kr', 'https://www.k-wonjin.co.kr']
A5sitemap.xml 제공
배점 3
L1
있으나 robots 미선언
/sitemap.xml 200이나 robots.txt에 Sitemap 미선언. URL 132개
A6Bing 색인 (ChatGPT 검색 경로)
배점 3
미검증
미검증
[manual] Bing Webmaster Tools 등록 여부는 오너 계정 접근 필요 (또는 site: 검색 수동 확인)
A7응답 속도·크롤 예산
배점 1
L3
TTFB < 0.5s, HTML < 300KB
TTFB 0.094s / 초기 HTML 153KB. 시술 페이지 145KB. 모두 기준 이내

B · 엔티티 식별·구조화 AI가 "이 병원이 누구인지"를 기계적으로 확정할 수 있는가. NAP 일관성과 스키마 위생.

+ + +
ID항목판정실측 근거
B1JSON-LD 문법 유효성
배점 3
L2
전부 유효
JSON-LD 4블록 전부 유효 (@graph 미사용)
B2업종 엔티티 스키마 (MedicalClinic / LegalService / LocalBusiness)
배점 5
L1
Organization만
ItemList + Organization만 존재. MedicalClinic/LocalBusiness 없음 → 주소·전화·진료시간이 구조화되어 있지 않음
B3전문가 스키마 (Physician / Attorney)
배점 3
L0
없음
Physician/Attorney 스키마 없음. 전문가 정보는 HTML 텍스트·이미지로만 존재
B4NAP 사이트 내 일관성
배점 3
L3
단일 표기
주소 단일 표기: "서울시 서초구 강남대로 419 파고다타워 12". 전화 6종: 02-3477-3300, 023480-3573, 02392-0330
B5sameAs 연결
배점 2
L3
5개 이상 (SNS + 버티컬 + 지도)
sameAs 10개 (SNS·버티컬·지도 연결)
B6canonical·중복 제거
배점 2
L2
있음
rel=canonical self-referencing 존재
B7다국어 hreflang
배점 2
L0
다국어 페이지 있으나 미연결
다국어 페이지 흔적(https://www.wonjinbeauty.com/en/) 있으나 hreflang 없음. 미연결

C · 답변 인용 가능 콘텐츠 패시지 단위로 잘라내도 자기완결적인 사실 덩어리가 있는가. 정의문·FAQ·수치·표·의료진 근거.

+ + +
ID항목판정실측 근거
C1정의문형 첫 문단
배점 4
L0
없음 (슬로건·이미지만)
홈 본문 1,999자에 "원진성형외과는 …에 있는 … 병원입니다" 형태의 정의문 없음. 소개 문구(25년 헤리티지·강남역)는 메인 비주얼 이미지 alt 에만 있고, 소개 페이지(/hospitalinfo/about) 첫 단락도 슬로건형
C2FAQ 섹션
배점 4
L0
없음
FAQ·자주 묻는 질문·Q&A 섹션 탐지 안 됨 (메인·시술 페이지)
C3제목 계층 의미성
배점 3
L0
H1 없음 또는 5개 이상
메인 H1 0개: 없음. 시술 페이지 H1 없음
C4구체 수치 (가격·시간·회복)
배점 4
L2
시술별 일부 수치
눈매교정(CFS) 페이지에 수술 시간 2시간·단기 수면 또는 부분 마취·실밥 제거 7일·일상생활 3일 텍스트 존재. 트임(오픈아이) 40분·5~7일. 쌍꺼풀·눈매교정(글램아이·더블유착) 페이지는 수치 없음. 가격 표기 0회(비급여 안내 페이지는 별도)
C5표·비교 구조
배점 2
L0
없음
HTML <table> 없음. 비교 정보는 이미지로 추정 (이미지 표 여부는 수동 확인)
C6신선도 신호
배점 3
L1
1년 이상
최신 갱신 신호 2025-02-18 (sitemap lastmod 2025-02-18). 18개월 전. dateModified 마크업 없음
C7전문가 E-E-A-T (의료진 / 변호사)
배점 3
L2
자격·경력 텍스트
의료진 상세 페이지 17명의 직함·전문의 여부·경력(원장당 12~23줄)이 HTML 텍스트로 존재. 학술 활동 페이지 3,760자. 단 Physician 스키마·저자 표기는 없어 구조화되지 않음
C8패시지 자기완결성
배점 2
미검증
미검증
[manual] 핵심 페이지 단락 샘플 10개의 상호·시술명 포함 비율 수동 채점 필요

D · AI 인용 표면 확보 실제로 AI가 인용하는 외부 표면(강남언니·GBP·오픈웹)에 존재하는가. 네이버 자산은 글로벌 AI에 기여도 0.

+ + +
ID항목판정실측 근거
D1업종 버티컬 프로필 (병의원: 강남언니 / 법률: 로톡)
배점 6
미검증
미검증
강남언니 프로필은 공개 페이지 수동 실측 필요 (후기 수·의료진·이벤트·갱신일). 홈페이지 sameAs 에 버티컬 링크 포함 여부는 확인됨(10개 중)
D2Google 비즈니스 프로필
배점 4
미검증
미검증
[manual] Google Maps 검색으로 GBP 소유·리뷰·NAP 수동 실측 필요
D3오픈웹 언급 (티스토리·유튜브·언론)
배점 4
L2
유튜브 + 언론/티스토리
자체 YouTube 채널 @wjwonjin 영상 736편·구독 1.5만·누적 조회 3,113만(2026-09-08 API 집계). 인스타그램 3계정·페이스북·네이버 블로그(popokpop) 존재. 채널 sameAs 10개로 홈페이지와 연결됨. 단 홈페이지 내 외부 링크는 JS 렌더라 HTML에서 미노출
D4표면 간 NAP 완전 일치
배점 3
미검증
미검증
[manual] 홈페이지·버티컬·GBP·플레이스 NAP 대조표 수동 작성 필요
D5네이버 플레이스 (AI 브리핑 전용)
배점 2
미검증
미검증
[semi·사람 판정 필요] 사이트에 네이버 플레이스 링크 없음. 플레이스 존재·홈페이지 역연결·리뷰 수 수동 확인
D6위키데이터/위키백과 엔티티
배점 1
L0
없음
Wikidata에서 "원진성형외과" 검색 결과 없음

E · AI 가시성 측정 인프라 개선을 증명할 수 있는가. 소유 신호(크롤러 로그·GA4 AI 유입) 계측 여부.

+ + +
ID항목판정실측 근거
E1AI 크롤러 로그 (IP 검증)
배점 3
미검증
미검증
[manual] 서버 로그 접근 필요 (AI 크롤러 히트 + IP 검증)
E2GA4 AI 유입 채널
배점 3
미검증
미검증
[manual] GA4 접근 필요 (AI 유입 커스텀 채널그룹 여부)
E3GSC AI Overviews 노출
배점 2
미검증
미검증
[manual] GSC 접근 필요 (AI Overviews 노출)
E4기준선 스팟체크
배점 2
미검증
미검증
[manual] 기준선 스팟체크 미실시 (질의 10개 × 5회 반복은 별도 단계)

F · 기술 위생 이미지 대체텍스트·CMS 보안·페이지 무게·모바일. 보조 지표.

+ + +
ID항목판정실측 근거
F1이미지 대체텍스트
배점 2
L0
50% 이상 누락
메인 페이지 이미지 45개 중 28개(62%) alt 누락 또는 빈 값
F2CMS 보안·최신성
배점 1
미검증
미검증
Server: Microsoft-IIS/10.0, ASP.NET 계열 자체 제작 추정(meta generator 없음). CMS 버전·보안 패치 여부 판정 불가
F3페이지 무게
배점 1
L3
< 300KB
초기 HTML 153KB (300KB 미만)
F4모바일 대응
배점 1
L2
반응형
viewport meta 존재, 반응형. CWV 미측정
+
+ +
+
Action Plan

지금 고칠 것과 4주 안에 만들 것을 나눴습니다

+

P0 · 지금 고칠 것 (1주 안)

1일
P0

정본 URL 수렴 + sitemap 선언

k-wonjin.co.kr → www.k-wonjin.co.kr 로 301 통일, robots.txt 에 Sitemap: 선언, sitemap lastmod 갱신. 전화번호를 대표번호 1개로 통일.

연결 항목 A4 A5 B4
1주
P0

MedicalClinic + Physician 스키마

Organization 을 MedicalClinic 으로 승격(address·telephone·openingHoursSpecification·medicalSpecialty). 의료진 17명 Physician 스키마(이름·직함·전문의·프로필 URL). 영문 사이트와 hreflang 상호 연결.

연결 항목 B2 B3 B7

P1 · 4주 안에 만들 것

2~4주
P1

시술 페이지 인용 구조: H1·표·FAQ

시술 페이지마다 H1 1개, 수술 시간·마취·실밥·일상 복귀를 HTML 표로, FAQ 5문항 + FAQPage 스키마. CFS·트임 페이지의 수치 형식을 다른 눈·코·윤곽 페이지로 확산. 메인에 병원 정의문 한 단락.

연결 항목 C1 C2 C3 C4 C5
1주
P1

이미지 alt 일괄 정비 + 갱신 신호

메인 28개 이미지 alt 작성(무엇을 찍은 사진인지 사실만). 페이지에 dateModified 마크업, sitemap lastmod 를 실제 수정일로.

연결 항목 F1 C6
2~4주
P1

서포터즈 사이트로 오픈웹 원문 공급

자동 빌드 미리보기(supporters-wonjin.vercel.app)의 글 6편을 병원이 검토·승인하면 색인 허용 도메인으로 발행. 유튜브 설명 영상 10편을 글에 연결. 이후 질문 뱅크 기준으로 편집 캘린더 운영.

연결 항목 C2 C4 C5 D3

P2 · 이어서 할 것

지속
P2

표면 실측과 측정 인프라

강남언니·GBP·네이버 플레이스 NAP 대조표 작성, GA4 AI 유입 채널그룹, GSC AI Overviews 확인, 서버 로그의 AI 크롤러 히트 계측. Bing Webmaster 등록.

연결 항목 D1 D2 D4 D5 E1 E2 E3 A6
+
+ +
+
Supporters Preview

홈페이지 자료만으로 서포터즈 사이트 초안을 만들었습니다

+

병원 URL 하나로 근거 수집, 글 생성, 발행 게이트, 미리보기 배포까지 자동으로 돌렸습니다. 모든 글은 의학 검토 대기 상태이고 색인은 막혀 있습니다. 병원이 확인 항목을 입력하고 검토·승인하면 코드 수정 없이 발행됩니다.

+
+
6글 (게이트 통과)
+
736유튜브 영상 집계
+
66사용 가능 이미지 (전후·사례 제외)
+
17의료진 프로필
+
+

미리보기 https://supporters-wonjin.vercel.app · 병원 확인 항목 입력 infinith-demo.vercel.app/supporters/wonjin

+
+
+

자동 생성한 글 6편

+ + +
분류제목근거 영상병원 확인 대기상태
A원진성형외과는 어떤 병원인가요? 진료 분야·의료진 구성·위치0편5건의학 검토 대기
B원진성형외과 방문 안내: 위치·진료시간·주차·예약은 어떻게 하나요?0편3건의학 검토 대기
D원진성형외과 윤곽은 어떤 방법이 있고 시술 시간·마취·회복은 어떻게 되나요?0편5건의학 검토 대기
D원진성형외과 눈성형은 어떤 방법이 있고 시술 시간·마취·회복은 어떻게 되나요?3편5건의학 검토 대기
D원진성형외과 레이저안티에이징은 어떤 방법이 있고 시술 시간·마취·회복은 어떻게 되나요?0편6건의학 검토 대기
C상담에서 꼭 물어봐야 할 질문은 무엇인가요?3편3건의학 검토 대기
+

병원이 확인해 주실 것 9가지

+

홈페이지 공개 자료에 없어 병원만 답할 수 있는 값입니다. 입력 전까지 사이트에는 "확인 대기"로 표시됩니다.

+
1 작성자 실명·직함·공개 프로필
2 글별 의학 검토 원장과 검토일
3 지원 관계 문구
4 견적 기본 포함 항목·결제 방식
5 회복 일정표의 병원 확정값
6 재수술 정책
7 페이지 간 표기 불일치의 정답
8 진료 분야별 담당 원장
9 정식 도메인·색인 허용 시점·홈페이지 링크 위치
+

싣지 않는 것: 전후 사진, 환자 경험담, 다른 병원과의 비교, 효과 보장, 가격 금액. 이미지는 의료법 기준 규칙에 따라 전후·사례·모델·수술 장면·인증 마크를 자동 제외했습니다.

+
+ +
+
Integrity

근거 없는 것은 약속하지 않습니다

+ + +
하지 않는 것이유
llms.txt 제작Google 공식(2026-06) 효과 0, 채택률 0.13%, 서버 로그에 요청 자체가 없음. 위약이다.
"스키마 넣으면 AI가 인용합니다" 약속인과 증거 없음. 스키마는 엔티티 식별을 돕는 위생 조치로만 설명한다.
단발 조회로 순위·노출 보고LLM 답변 분산 10~34%. 반복 측정 + 신뢰구간으로만 보고한다.
답변엔진 UI 자동 조회OpenAI·Perplexity 약관 위반. 주력 측정은 오너가 소유한 신호(로그·GA4)로 한다.
네이버 블로그 증량blog.naver.com robots.txt가 AI 크롤링을 전면 금지. 글로벌 AI 답변 기여도 0. 네이버 AI 브리핑은 별도 트랙.
+

측정 조건

+ +

채점 방법

+

기준표 v1.0 36개 실측 항목(A 접근성 · B 엔티티 · C 콘텐츠 · D 표면 · E 측정 · F 위생)을 0~3 레벨로 판정하고, v2.0은 그 항목을 답변 준비도(AEO) 8개와 출처 준비도(GEO) 8개로 묶어 각 100점으로 정규화합니다. 미검증 항목은 분모에서 빼고, 치명 게이트(크롤러 차단 등)에 걸리면 상한을 둡니다. 답변엔진 언급률은 단발 조회로는 재지 않습니다.

+
+ + + \ No newline at end of file diff --git a/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.pdf b/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.pdf new file mode 100644 index 0000000..dbebd5e Binary files /dev/null and b/docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.pdf differ diff --git a/docs/reports/wonjin/01_readiness_report/Wonjin_audit_aeo_geo_2026-09-08.json b/docs/reports/wonjin/01_readiness_report/Wonjin_audit_aeo_geo_2026-09-08.json new file mode 100644 index 0000000..9f09cd8 --- /dev/null +++ b/docs/reports/wonjin/01_readiness_report/Wonjin_audit_aeo_geo_2026-09-08.json @@ -0,0 +1,192 @@ +{ + "_meta": { + "sampleUrls": [ + "https://www.k-wonjin.co.kr", + "https://www.k-wonjin.co.kr/contents/eye/cfs" + ], + "sampleWarning": "표본 URL 2개 (<5). 판정은 홈·대표 시술 페이지 기준이며 사이트 전체로 일반화하지 말 것. 시술 상세 3개·오시는길·블로그를 curl+파서로 추가 확인할 것 (2026-08-28 뷰성형외과 오판 3건의 원인)" + }, + "results": [ + { + "criterionId": "A1", + "level": 3, + "evidence": "12개 AI 봇 전부 허용. OAI-SearchBot·PerplexityBot·GPTBot UA로 GET → 전부 200", + "source": "robots.txt: User-agent: * / Disallow: /admin/" + }, + { + "criterionId": "A2", + "level": 3, + "evidence": "Server: Microsoft-IIS/10.0 직접 응답, Cloudflare 헤더 없음, AI UA 챌린지 없음" + }, + { + "criterionId": "A3", + "level": 3, + "evidence": "서버 렌더링. JS 미실행 HTML에서 본문 텍스트 14,079자 추출" + }, + { + "criterionId": "A4", + "level": 1, + "evidence": "변형 간 최종 URL 불일치(중복 콘텐츠 위험): ['https://k-wonjin.co.kr', 'https://www.k-wonjin.co.kr']" + }, + { + "criterionId": "A5", + "level": 1, + "evidence": "/sitemap.xml 200이나 robots.txt에 Sitemap 미선언. URL 132개" + }, + { + "criterionId": "A6", + "level": "unverified", + "evidence": "[manual] Bing Webmaster Tools 등록 여부는 오너 계정 접근 필요 (또는 site: 검색 수동 확인)" + }, + { + "criterionId": "A7", + "level": 3, + "evidence": "TTFB 0.094s / 초기 HTML 153KB. 시술 페이지 145KB — 모두 기준 이내" + }, + { + "criterionId": "B1", + "level": 2, + "evidence": "JSON-LD 4블록 전부 유효 (@graph 미사용)" + }, + { + "criterionId": "B2", + "level": 1, + "evidence": "ItemList + Organization만 존재. MedicalClinic/LocalBusiness 없음 → 주소·전화·진료시간이 구조화되어 있지 않음" + }, + { + "criterionId": "B3", + "level": 0, + "evidence": "Physician/Attorney 스키마 없음. 전문가 정보는 HTML 텍스트·이미지로만 존재" + }, + { + "criterionId": "B4", + "level": 3, + "evidence": "주소 단일 표기: \"서울시 서초구 강남대로 419 파고다타워 12\". 전화 6종: 02-3477-3300, 023480-3573, 02392-0330" + }, + { + "criterionId": "B5", + "level": 3, + "evidence": "sameAs 10개 (SNS·버티컬·지도 연결)" + }, + { + "criterionId": "B6", + "level": 2, + "evidence": "rel=canonical self-referencing 존재" + }, + { + "criterionId": "B7", + "level": 0, + "evidence": "다국어 페이지 흔적(https://www.wonjinbeauty.com/en/) 있으나 hreflang 없음 — 미연결" + }, + { + "criterionId": "C1", + "level": "unverified", + "evidence": "[semi·사람 판정 필요] 메인 첫 200자: \"당신만 봅니다 - WJ 원진성형외과 Ai 상담 카카오톡 상담 빠른 비용 상담 빠른 비용 상담 바로 예약 피부과 안녕하세요, WJ 원진 성형외과입니다 :-) 빠른 비용 상담 이름 연…\" / 시술 페이지 첫 200자: \"눈매교정(고도안검하수)-당신만 봅니다-원진성형외과 Ai 상담 카카오톡 상담 빠른 비용 상담 빠른 비용 상담 바로 예약 피부과 안녕하세요, WJ …\" (첫 200자 내 상호 있음)" + }, + { + "criterionId": "C2", + "level": 0, + "evidence": "FAQ·자주 묻는 질문·Q&A 섹션 탐지 안 됨 (메인·시술 페이지)" + }, + { + "criterionId": "C3", + "level": 0, + "evidence": "메인 H1 0개: 없음. 시술 페이지 H1 없음" + }, + { + "criterionId": "C4", + "level": "unverified", + "evidence": "[semi·사람 판정 필요] 시술 페이지 수치 밀도: 가격표기 0회, 시간 2회, 일/주 14회, % 0회, 가격/비용/회복 단어 8회 — 표기 맥락(마케팅 문구 vs 실제 표) 확인 필요" + }, + { + "criterionId": "C5", + "level": 0, + "evidence": "HTML 없음. 비교 정보는 이미지로 추정 (이미지 표 여부는 수동 확인)" + }, + { + "criterionId": "C6", + "level": 1, + "evidence": "최신 갱신 신호 2025-02-18 (sitemap lastmod 2025-02-18) — 18개월 전. dateModified 마크업 없음" + }, + { + "criterionId": "C7", + "level": "unverified", + "evidence": "[semi·사람 판정 필요] 전문가 언급 22회, 권위 키워드 15회 (논문, 인증, 학회) — 자격·경력이 텍스트인지 이미지인지 확인 필요" + }, + { + "criterionId": "C8", + "level": "unverified", + "evidence": "[manual] 핵심 페이지 단락 샘플 10개의 상호·시술명 포함 비율 수동 채점 필요" + }, + { + "criterionId": "D1", + "level": "unverified", + "evidence": "[manual] 업종 버티컬(병의원: 강남언니 / 법률: 로톡) 프로필 수동 실측 필요 — 후기 수·의료진·이벤트·갱신일" + }, + { + "criterionId": "D2", + "level": "unverified", + "evidence": "[manual] Google Maps 검색으로 GBP 소유·리뷰·NAP 수동 실측 필요" + }, + { + "criterionId": "D3", + "level": "unverified", + "evidence": "[semi·사람 판정 필요] 검색 그라운딩 미실시. 사이트에서 발견된 외부 채널: pf.kakao.com(2), www.facebook.com(2), www.instagram.com(2), blog.naver.com(2), www.youtube.com(2) — naver.com 제외 오픈웹 언급(티스토리·언론)은 검색으로 별도 집계 필요" + }, + { + "criterionId": "D4", + "level": "unverified", + "evidence": "[manual] 홈페이지·버티컬·GBP·플레이스 NAP 대조표 수동 작성 필요" + }, + { + "criterionId": "D5", + "level": "unverified", + "evidence": "[semi·사람 판정 필요] 사이트에 네이버 플레이스 링크 없음 — 플레이스 존재·홈페이지 역연결·리뷰 수 수동 확인" + }, + { + "criterionId": "D6", + "level": 0, + "evidence": "Wikidata에서 \"원진성형외과\" 검색 결과 없음" + }, + { + "criterionId": "E1", + "level": "unverified", + "evidence": "[manual] 서버 로그 접근 필요 (AI 크롤러 히트 + IP 검증)" + }, + { + "criterionId": "E2", + "level": "unverified", + "evidence": "[manual] GA4 접근 필요 (AI 유입 커스텀 채널그룹 여부)" + }, + { + "criterionId": "E3", + "level": "unverified", + "evidence": "[manual] GSC 접근 필요 (AI Overviews 노출)" + }, + { + "criterionId": "E4", + "level": "unverified", + "evidence": "[manual] 기준선 스팟체크 미실시 (질의 10개 × 5회 반복은 별도 단계)" + }, + { + "criterionId": "F1", + "level": 0, + "evidence": "메인 페이지 이미지 45개 중 28개(62%) alt 누락 또는 빈 값" + }, + { + "criterionId": "F2", + "level": "unverified", + "evidence": "meta generator 없음 — CMS 종류·버전 판정 근거 없음 (수동 확인 필요)" + }, + { + "criterionId": "F3", + "level": 3, + "evidence": "초기 HTML 153KB (300KB 미만)" + }, + { + "criterionId": "F4", + "level": 2, + "evidence": "viewport meta 존재, 반응형. CWV 미측정" + } + ] +} \ No newline at end of file diff --git a/scripts/build_discovery_report.ts b/scripts/build_discovery_report.ts new file mode 100644 index 0000000..c43de33 --- /dev/null +++ b/scripts/build_discovery_report.ts @@ -0,0 +1,189 @@ +/** + * AI Answer Readiness 리포트 HTML 빌더. /discovery/:id 와 같은 데이터(discoveryResults + 기준표 v1/v2 + 채점 lib)로 + * 독립 HTML 한 파일을 만든다. PDF 는 Chrome headless 로 이 HTML 을 인쇄한다. + * + * npx esbuild scripts/build_discovery_report.ts --bundle --platform=node --format=esm --outfile=/report.mjs + * node /report.mjs --id wonjin --out docs/reports/wonjin/01_readiness_report/Wonjin_AI_Answer_Readiness_Report_v2.0_2026-09-08.html + * [--status ~/supporters-builds/wonjin/status.json] [--site ~/supporters-builds/wonjin/site] [--briefs ~/supporters-builds/wonjin/briefs.json] + * + * 화법: 고객용. 판단 제목은 "~합니다", 목차성 제목은 명사구. 엠대시 없음. 숫자는 표와 배지에만. + */ +import { readFileSync, writeFileSync, existsSync } from 'node:fs'; +import { DISCOVERY_RESULTS } from '../src/data/discoveryResults'; +import { AEO_GEO_RUBRIC } from '../src/data/aeoGeoRubric'; +import { AEO_GEO_RUBRIC_V2 } from '../src/data/aeoGeoRubricV2'; +import { scoreDiscovery } from '../src/lib/discoveryScore'; +import { scoreDiscoveryV2 } from '../src/lib/discoveryScoreV2'; + +const args = process.argv.slice(2); +const opt = (k: string, d?: string) => { const i = args.indexOf(`--${k}`); return i >= 0 && args[i + 1] && !args[i + 1].startsWith('--') ? args[i + 1] : d; }; +const id = opt('id', 'wonjin')!; +const out = opt('out')!; +const result = DISCOVERY_RESULTS[id]; +if (!result || !out) { console.error('--id <등록된 id> --out 필요'); process.exit(2); } +const v1 = scoreDiscovery(AEO_GEO_RUBRIC, result); +const v2 = scoreDiscoveryV2(AEO_GEO_RUBRIC_V2, result); +const today = new Date().toISOString().slice(0, 10); +const readJson = (p?: string) => (p && existsSync(p) ? JSON.parse(readFileSync(p, 'utf8')) : null); +const status = readJson(opt('status')); +const site = opt('site'); +const briefs = readJson(opt('briefs')); +const videos = readJson(site ? `${site}/src/data/videos.json` : undefined); +const images = readJson(site ? `${site}/src/data/images.json` : undefined); +const authors = readJson(site ? `${site}/src/data/authors.json` : undefined); + +const esc = (s: unknown) => String(s ?? '').replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +const criterionById = new Map(AEO_GEO_RUBRIC.criteria.map((c) => [c.id, c])); +const resultById = new Map(result.results.map((r) => [r.criterionId, r])); +const levelLabel = (cid: string, level: number | 'unverified') => { + if (level === 'unverified') return '미검증'; + const c = criterionById.get(cid); return c?.levels.find((l) => l.level === level)?.label ?? String(level); +}; +const gradeStyle: Record = { A: 'background:#E9F7EF;color:#2E7D4F;border-color:#BFE6CE', B: 'background:#EEF3FF;color:#2F4FBF;border-color:#C9D7FF', C: 'background:#FFF4E5;color:#B26A00;border-color:#FFD9A8', D: 'background:#FDECEF;color:#B84C5F;border-color:#F7C3CD' }; +const sevStyle: Record = { critical: '#D4889A', warning: '#D4A872', good: '#9B8AD4' }; +const sevLabel: Record = { critical: '핵심 과제', warning: '보완', good: '강점' }; +const ring = (score: number, label: string, grade: string) => { + const r = 52, c = 2 * Math.PI * r, off = c * (1 - score / 100); + return `
${score}/ 100${label} 등급 ${grade}
`; +}; + +const verified = v1.categories.reduce((s, c) => s + c.verifiedCount, 0); +const total = AEO_GEO_RUBRIC.criteria.length; +const P = { P0: '지금 고칠 것 (1주 안)', P1: '4주 안에 만들 것', P2: '이어서 할 것' } as Record; + +// 서포터즈 자동 빌드 섹션 데이터 +const posts = (status?.posts ?? []) as any[]; +const briefById = new Map(((briefs?.posts ?? []) as any[]).map((b) => [b.id, b])); +const imgCounts = images?.counts ?? null; +const physicians = authors?.physicians ? Object.keys(authors.physicians).length : 0; +const INPUTS = ['작성자 실명·직함·공개 프로필', '글별 의학 검토 원장과 검토일', '지원 관계 문구', '견적 기본 포함 항목·결제 방식', '회복 일정표의 병원 확정값', '재수술 정책', '페이지 간 표기 불일치의 정답', '진료 분야별 담당 원장', '정식 도메인·색인 허용 시점·홈페이지 링크 위치']; + +const axisTable = (ax: typeof v2.aeo) => ` +
+${ax.items.map((it) => ``).join('')} +
항목무엇을 보는가점수근거파생된 실측 항목
${esc(it.item.id)}${esc(it.item.name)}
${esc(it.item.question)}
${it.pct === null ? '미검증' : `${Math.round(it.pct * 100)} / 100`}${it.basis === 'derived' ? '실측 파생' : it.basis === 'judged' ? '사람 판정' : '미검증'}${it.signals.map((s) => `${s.criterionId} ${s.level === 'unverified' ? '미검증' : 'L' + s.level}`).join(' · ')}
+${ax.cappedBy?.length ? `

게이트 상한 적용: ${ax.cappedBy.map((g) => esc(g.gate.name)).join(', ')}. 상한 전 점수 ${ax.rawScore}.

` : ''}`; + +const html = ` + +${esc(result.clinicName)} AI Answer Readiness Report v${esc(result.rubricVersion)} + + + + +
+
INFINITH AI Discovery · AEO / GEO Audit v${esc(result.rubricVersion)}
+

AI Answer Readiness

+
${esc(result.clinicName)}
+
${esc(result.industry)} · ${esc(result.url)}
+

AI 답변엔진(ChatGPT·Perplexity·Gemini·네이버 AI 브리핑)이 이 병원을 얼마나 읽고, 믿고, 인용할 수 있는지를 실측 신호로 채점한 리포트입니다. 답변 준비도(AEO)와 출처 준비도(GEO)를 각각 100점으로 보고, 확인하지 못한 항목은 점수에서 뺍니다.

+
+
${ring(v2.aeo.score, 'AEO', v2.aeo.grade)}${ring(v2.geo.score, 'GEO', v2.geo.grade)}
+
+
${verified}실측 항목 / ${total}
+
${v1.score}v1.0 종합 (${v1.grade})
+
${result.keyFindings.length}핵심 발견
+
${result.actions.length}실행 항목
+
+
+

실측일 ${esc(result.auditedAt)} · 리포트 작성 ${today} · 미검증 ${total - verified}개 항목은 분모에서 제외했습니다. 조건은 마지막 장에 적었습니다.

+
+ +
+
Findings

AI가 지금 ${esc(result.clinicName)}를 어떻게 읽는지 정리했습니다

+
+ ${result.keyFindings.map((f) => `
${sevLabel[f.severity]}

${esc(f.title)}

${esc(f.detail)}

`).join('')} +
+
+ +
+
AEO · Answer Readiness

답변 준비도 ${v2.aeo.items.length}개 항목

+

${esc(v2.aeo.axis.description)}

+ ${axisTable(v2.aeo)} +
GEO · Source Readiness

출처 준비도 ${v2.geo.items.length}개 항목

+

${esc(v2.geo.axis.description)}

+ ${axisTable(v2.geo)} +
+ +
+
Category Detail

카테고리별 실측 ${total}개 항목

+
+ ${v1.categories.map((c) => `
${esc(c.category.code)} · ${esc(c.category.nameEn)}

${esc(c.category.name)}

${c.pct} / 100 · 실측 ${c.verifiedCount}/${c.totalCount}
`).join('')} +
+
+
+ ${AEO_GEO_RUBRIC.categories.map((cat) => { + const rows = AEO_GEO_RUBRIC.criteria.filter((c) => c.category === cat.id); + return `

${esc(cat.code)} · ${esc(cat.name)} ${esc(cat.description)}

+ + ${rows.map((c) => { const r = resultById.get(c.id); const lv = r?.level ?? 'unverified'; const cls = lv === 'unverified' ? 'lvu' : `lv${lv}`; return ``; }).join('')} +
ID항목판정실측 근거
${c.id}${esc(c.name)}
배점 ${c.weight}
${lv === 'unverified' ? '미검증' : 'L' + lv}
${esc(levelLabel(c.id, lv))}
${esc(r?.evidence ?? '')}
`; + }).join('')} +
+ +
+
Action Plan

지금 고칠 것과 4주 안에 만들 것을 나눴습니다

+ ${(['P0', 'P1', 'P2'] as const).map((p) => { const list = result.actions.filter((a) => a.priority === p); if (!list.length) return ''; return `

${p} · ${P[p]}

${list.map((a) => `
${esc(a.effort)}
${p}

${esc(a.title)}

${esc(a.detail)}

연결 항목 ${a.criterionIds.map((c) => `${c}`).join(' ')}
`).join('')}
`; }).join('')} +
+ +${status ? `
+
Supporters Preview

홈페이지 자료만으로 서포터즈 사이트 초안을 만들었습니다

+

병원 URL 하나로 근거 수집, 글 생성, 발행 게이트, 미리보기 배포까지 자동으로 돌렸습니다. 모든 글은 의학 검토 대기 상태이고 색인은 막혀 있습니다. 병원이 확인 항목을 입력하고 검토·승인하면 코드 수정 없이 발행됩니다.

+
+
${posts.length}글 (게이트 통과)
+
${videos?.channel?.videos ?? '-'}유튜브 영상 집계
+
${imgCounts ? imgCounts.doctors + imgCounts.clinic + imgCounts.procedure + imgCounts.equipment : '-'}사용 가능 이미지 (전후·사례 제외)
+
${physicians}의료진 프로필
+
+

미리보기 ${status.previewUrl ? `${esc(status.previewUrl)}` : '준비 중'} · 병원 확인 항목 입력 infinith-demo.vercel.app/supporters/${esc(id)}

+
+
+

자동 생성한 글 ${posts.length}편

+ + ${posts.map((p: any) => { const b = briefById.get(p.id); return ``; }).join('')} +
분류제목근거 영상병원 확인 대기상태
${esc(p.category)}${esc(p.title)}${status.previewUrl ? `` : ''}${(b?.videos ?? []).length}편${(p.pending ?? []).length}건의학 검토 대기
+

병원이 확인해 주실 것 ${INPUTS.length}가지

+

홈페이지 공개 자료에 없어 병원만 답할 수 있는 값입니다. 입력 전까지 사이트에는 "확인 대기"로 표시됩니다.

+
${INPUTS.map((t, i) => `
${i + 1} ${esc(t)}
`).join('')}
+

싣지 않는 것: 전후 사진, 환자 경험담, 다른 병원과의 비교, 효과 보장, 가격 금액. 이미지는 의료법 기준 규칙에 따라 전후·사례·모델·수술 장면·인증 마크를 자동 제외했습니다.

+
` : ''} + +
+
Integrity

근거 없는 것은 약속하지 않습니다

+ + ${result.notDoing.map((n) => ``).join('')} +
하지 않는 것이유
${esc(n.item)}${esc(n.reason)}
+

측정 조건

+ +

채점 방법

+

기준표 v1.0 ${total}개 실측 항목(A 접근성 · B 엔티티 · C 콘텐츠 · D 표면 · E 측정 · F 위생)을 0~3 레벨로 판정하고, v2.0은 그 항목을 답변 준비도(AEO) ${v2.aeo.items.length}개와 출처 준비도(GEO) ${v2.geo.items.length}개로 묶어 각 100점으로 정규화합니다. 미검증 항목은 분모에서 빼고, 치명 게이트(크롤러 차단 등)에 걸리면 상한을 둡니다. 답변엔진 언급률은 단발 조회로는 재지 않습니다.

+
+ + +`; +writeFileSync(out, html); +console.log(`${out} · AEO ${v2.aeo.score}${v2.aeo.grade} · GEO ${v2.geo.score}${v2.geo.grade} · v1 ${v1.score}${v1.grade} · 실측 ${verified}/${total}`); diff --git a/src/data/discoveryResults.ts b/src/data/discoveryResults.ts index 86a29ae..acb86bf 100644 --- a/src/data/discoveryResults.ts +++ b/src/data/discoveryResults.ts @@ -5,8 +5,10 @@ import type { DiscoveryResult } from '../types/discovery'; import { DISCOVERY_VIEWCLINIC } from './discovery_viewclinic'; import { DISCOVERY_TAEHA } from './discovery_taeha'; +import { DISCOVERY_WONJIN } from './discovery_wonjin'; export const DISCOVERY_RESULTS: Record = { viewclinic: DISCOVERY_VIEWCLINIC, taeha: DISCOVERY_TAEHA, + wonjin: DISCOVERY_WONJIN, }; diff --git a/src/data/discovery_wonjin.ts b/src/data/discovery_wonjin.ts new file mode 100644 index 0000000..51fb7b3 --- /dev/null +++ b/src/data/discovery_wonjin.ts @@ -0,0 +1,112 @@ +/** + * 원진성형외과 (www.k-wonjin.co.kr) AEO/GEO 진단. 자동 채점 초안 + * 생성: audit_aeo_geo.py · 2026-09-08 · JS 미실행 HTML 기준 + * + * ⚠️ 이 파일은 초안이다. 배포 전 사람이 해야 할 일: + * 1. [semi·사람 판정 필요] 항목 5개(C1·C4·C7·D3·D5)의 증거를 보고 level 확정 + * 2. [manual] 항목 9개 중 실측 가능한 것(D1·D2·D4) 실측, 나머지는 unverified 유지 + * 3. keyFindings(3~5개) · actions(P0~P2) 작성 + * 4. discoveryResults.ts에 등록: wonjin: DISCOVERY_WONJIN, + */ +import type { DiscoveryResult } from '../types/discovery'; + +export const DISCOVERY_WONJIN: DiscoveryResult = { + id: 'wonjin', + clinicName: '원진성형외과', + url: 'https://www.k-wonjin.co.kr', + industry: '성형외과 (강남역)', + auditedAt: '2026-09-08', + rubricVersion: '2.0', + conditions: [ + '실측 대상: 메인 페이지 + /contents/eye/cfs 2개 URL, JS 미실행 HTML 기준', + '크롤러 접근성: robots.txt 파싱 + 12개 AI 봇 UA 실제 GET 요청', + 'semi/manual 항목은 자동 수집 증거만 첨부하고 미검증 처리, 분모 제외 (사람 보정 후 확정)', + '답변엔진 언급률은 측정하지 않았다 (단발 조회는 무효, 반복 측정은 별도 기준선 단계에서 수행)', + ], + results: [ + // A. 접근성 + { criterionId: 'A1', level: 3, evidence: '12개 AI 봇 전부 허용. OAI-SearchBot·PerplexityBot·GPTBot UA로 GET → 전부 200', source: 'robots.txt: User-agent: * / Disallow: /admin/' }, + { criterionId: 'A2', level: 3, evidence: 'Server: Microsoft-IIS/10.0 직접 응답, Cloudflare 헤더 없음, AI UA 챌린지 없음' }, + { criterionId: 'A3', level: 3, evidence: '서버 렌더링. JS 미실행 HTML에서 본문 텍스트 14,079자 추출' }, + { criterionId: 'A4', level: 1, evidence: '변형 간 최종 URL 불일치(중복 콘텐츠 위험): [\'https://k-wonjin.co.kr\', \'https://www.k-wonjin.co.kr\']' }, + { criterionId: 'A5', level: 1, evidence: '/sitemap.xml 200이나 robots.txt에 Sitemap 미선언. URL 132개' }, + { criterionId: 'A6', level: 'unverified', evidence: '[manual] Bing Webmaster Tools 등록 여부는 오너 계정 접근 필요 (또는 site: 검색 수동 확인)' }, + { criterionId: 'A7', level: 3, evidence: 'TTFB 0.094s / 초기 HTML 153KB. 시술 페이지 145KB. 모두 기준 이내' }, + // B. 엔티티 + { criterionId: 'B1', level: 2, evidence: 'JSON-LD 4블록 전부 유효 (@graph 미사용)' }, + { criterionId: 'B2', level: 1, evidence: 'ItemList + Organization만 존재. MedicalClinic/LocalBusiness 없음 → 주소·전화·진료시간이 구조화되어 있지 않음' }, + { criterionId: 'B3', level: 0, evidence: 'Physician/Attorney 스키마 없음. 전문가 정보는 HTML 텍스트·이미지로만 존재' }, + { criterionId: 'B4', level: 3, evidence: '주소 단일 표기: "서울시 서초구 강남대로 419 파고다타워 12". 전화 6종: 02-3477-3300, 023480-3573, 02392-0330' }, + { criterionId: 'B5', level: 3, evidence: 'sameAs 10개 (SNS·버티컬·지도 연결)' }, + { criterionId: 'B6', level: 2, evidence: 'rel=canonical self-referencing 존재' }, + { criterionId: 'B7', level: 0, evidence: '다국어 페이지 흔적(https://www.wonjinbeauty.com/en/) 있으나 hreflang 없음. 미연결' }, + // C. 콘텐츠 + { criterionId: 'C1', level: 0, evidence: "홈 본문 1,999자에 \"원진성형외과는 …에 있는 … 병원입니다\" 형태의 정의문 없음. 소개 문구(25년 헤리티지·강남역)는 메인 비주얼 이미지 alt 에만 있고, 소개 페이지(/hospitalinfo/about) 첫 단락도 슬로건형", source: "evidence/wonjin/pages/home.json · hospitalinfo-about.json (2026-09-07)" }, + { criterionId: 'C2', level: 0, evidence: 'FAQ·자주 묻는 질문·Q&A 섹션 탐지 안 됨 (메인·시술 페이지)' }, + { criterionId: 'C3', level: 0, evidence: '메인 H1 0개: 없음. 시술 페이지 H1 없음' }, + { criterionId: 'C4', level: 2, evidence: "눈매교정(CFS) 페이지에 수술 시간 2시간·단기 수면 또는 부분 마취·실밥 제거 7일·일상생활 3일 텍스트 존재. 트임(오픈아이) 40분·5~7일. 쌍꺼풀·눈매교정(글램아이·더블유착) 페이지는 수치 없음. 가격 표기 0회(비급여 안내 페이지는 별도)", source: "https://www.k-wonjin.co.kr/contents/eye/cfs 원본 HTML 파싱 (2026-09-07 근거 수집)" }, + { criterionId: 'C5', level: 0, evidence: 'HTML 없음. 비교 정보는 이미지로 추정 (이미지 표 여부는 수동 확인)' }, + { criterionId: 'C6', level: 1, evidence: '최신 갱신 신호 2025-02-18 (sitemap lastmod 2025-02-18). 18개월 전. dateModified 마크업 없음' }, + { criterionId: 'C7', level: 2, evidence: "의료진 상세 페이지 17명의 직함·전문의 여부·경력(원장당 12~23줄)이 HTML 텍스트로 존재. 학술 활동 페이지 3,760자. 단 Physician 스키마·저자 표기는 없어 구조화되지 않음", source: "evidence/wonjin/doctors.json (2026-09-07)" }, + { criterionId: 'C8', level: 'unverified', evidence: '[manual] 핵심 페이지 단락 샘플 10개의 상호·시술명 포함 비율 수동 채점 필요' }, + // D. 표면 + { criterionId: 'D1', level: 'unverified', evidence: "강남언니 프로필은 공개 페이지 수동 실측 필요 (후기 수·의료진·이벤트·갱신일). 홈페이지 sameAs 에 버티컬 링크 포함 여부는 확인됨(10개 중)" }, + { criterionId: 'D2', level: 'unverified', evidence: '[manual] Google Maps 검색으로 GBP 소유·리뷰·NAP 수동 실측 필요' }, + { criterionId: 'D3', level: 2, evidence: "자체 YouTube 채널 @wjwonjin 영상 736편·구독 1.5만·누적 조회 3,113만(2026-09-08 API 집계). 인스타그램 3계정·페이스북·네이버 블로그(popokpop) 존재. 채널 sameAs 10개로 홈페이지와 연결됨. 단 홈페이지 내 외부 링크는 JS 렌더라 HTML에서 미노출", source: "YouTube Data API v3 channels.list, clinic registry (2026-09-08)" }, + { criterionId: 'D4', level: 'unverified', evidence: '[manual] 홈페이지·버티컬·GBP·플레이스 NAP 대조표 수동 작성 필요' }, + { criterionId: 'D5', level: 'unverified', evidence: '[semi·사람 판정 필요] 사이트에 네이버 플레이스 링크 없음. 플레이스 존재·홈페이지 역연결·리뷰 수 수동 확인' }, + { criterionId: 'D6', level: 0, evidence: 'Wikidata에서 "원진성형외과" 검색 결과 없음' }, + // E. 측정 + { criterionId: 'E1', level: 'unverified', evidence: '[manual] 서버 로그 접근 필요 (AI 크롤러 히트 + IP 검증)' }, + { criterionId: 'E2', level: 'unverified', evidence: '[manual] GA4 접근 필요 (AI 유입 커스텀 채널그룹 여부)' }, + { criterionId: 'E3', level: 'unverified', evidence: '[manual] GSC 접근 필요 (AI Overviews 노출)' }, + { criterionId: 'E4', level: 'unverified', evidence: '[manual] 기준선 스팟체크 미실시 (질의 10개 × 5회 반복은 별도 단계)' }, + // F. 위생 + { criterionId: 'F1', level: 0, evidence: '메인 페이지 이미지 45개 중 28개(62%) alt 누락 또는 빈 값' }, + { criterionId: 'F2', level: 'unverified', evidence: "Server: Microsoft-IIS/10.0, ASP.NET 계열 자체 제작 추정(meta generator 없음). CMS 버전·보안 패치 여부 판정 불가" }, + { criterionId: 'F3', level: 3, evidence: '초기 HTML 153KB (300KB 미만)' }, + { criterionId: 'F4', level: 2, evidence: 'viewport meta 존재, 반응형. CWV 미측정' }, + ], + keyFindings: [ + { + title: "크롤러 접근은 열려 있습니다. 서버 렌더링이라 AI가 본문을 읽습니다", + detail: "robots.txt가 AI 검색봇 12종을 모두 허용하고, IIS가 본문을 서버에서 렌더링해 JS 없이도 14,079자를 읽을 수 있습니다. TTFB 0.09초, 초기 HTML 153KB로 가볍습니다. 다만 www 유무에 따라 최종 URL이 갈라지고(정본 미수렴), sitemap이 robots.txt에 선언돼 있지 않습니다.", + severity: "good", + }, + { + title: "연결은 됐지만 병원 자체가 스키마로 정의돼 있지 않습니다", + detail: "Organization.sameAs 10개로 SNS·지도·버티컬을 잘 묶었고 주소 표기도 한 가지입니다. 그러나 MedicalClinic·Physician 스키마가 없어 주소·전화·진료시간·의료진 17명이 구조화돼 있지 않고, 전화번호는 6종이 섞여 있습니다. 영문 사이트(wonjinbeauty.com)는 hreflang으로 연결되지 않았습니다.", + severity: "critical", + }, + { + title: "인용할 문장이 부족합니다. H1도 표도 정의문도 없습니다", + detail: "메인·시술 페이지에 H1이 없고 HTML 표가 없으며 병원 정의문도 없습니다. 눈매교정(CFS)·트임 페이지에는 수술 시간·마취·실밥·일상 복귀 수치가 텍스트로 있어 인용 구조의 출발점이 될 수 있지만, 쌍꺼풀·눈매교정 나머지 페이지는 수치가 없습니다. 최신 갱신 신호가 2025-02-18(sitemap)로 18개월 전입니다.", + severity: "critical", + }, + { + title: "유튜브는 강합니다. 736편·누적 3,113만 회", + detail: "설명형 롱폼(눈성형 관리법·중년 눈성형 비교·지방흡입 QnA 등)이 있어 글의 근거 영상으로 쓸 수 있습니다. 다만 상위 조회 영상의 다수가 브랜드 필름·연예인·전후 형식이라 인용용 정보형 영상은 10편 안팎입니다. 이 채널이 원진의 가장 큰 오픈웹 자산입니다.", + severity: "warning", + }, + { + title: "이미지 alt 62% 누락, 의료진 경력은 텍스트지만 구조화는 안 됨", + detail: "메인 이미지 45개 중 28개가 alt 없이 실려 AI가 이미지 내용을 읽지 못합니다. 의료진 17명의 경력은 텍스트로 있어(원장당 12~23줄) Physician 스키마만 붙이면 바로 엔티티가 됩니다. 강남언니·GBP·네이버 플레이스는 이번 자동 채점 범위 밖이라 수동 실측이 남아 있습니다.", + severity: "warning", + }, + ], + actions: [ + { priority: "P0", title: "정본 URL 수렴 + sitemap 선언", detail: "k-wonjin.co.kr → www.k-wonjin.co.kr 로 301 통일, robots.txt 에 Sitemap: 선언, sitemap lastmod 갱신. 전화번호를 대표번호 1개로 통일.", criterionIds: ["A4", "A5", "B4"], effort: "1일" }, + { priority: "P0", title: "MedicalClinic + Physician 스키마", detail: "Organization 을 MedicalClinic 으로 승격(address·telephone·openingHoursSpecification·medicalSpecialty). 의료진 17명 Physician 스키마(이름·직함·전문의·프로필 URL). 영문 사이트와 hreflang 상호 연결.", criterionIds: ["B2", "B3", "B7"], effort: "1주" }, + { priority: "P1", title: "시술 페이지 인용 구조: H1·표·FAQ", detail: "시술 페이지마다 H1 1개, 수술 시간·마취·실밥·일상 복귀를 HTML 표로, FAQ 5문항 + FAQPage 스키마. CFS·트임 페이지의 수치 형식을 다른 눈·코·윤곽 페이지로 확산. 메인에 병원 정의문 한 단락.", criterionIds: ["C1", "C2", "C3", "C4", "C5"], effort: "2~4주" }, + { priority: "P1", title: "이미지 alt 일괄 정비 + 갱신 신호", detail: "메인 28개 이미지 alt 작성(무엇을 찍은 사진인지 사실만). 페이지에 dateModified 마크업, sitemap lastmod 를 실제 수정일로.", criterionIds: ["F1", "C6"], effort: "1주" }, + { priority: "P1", title: "서포터즈 사이트로 오픈웹 원문 공급", detail: "자동 빌드 미리보기(supporters-wonjin.vercel.app)의 글 6편을 병원이 검토·승인하면 색인 허용 도메인으로 발행. 유튜브 설명 영상 10편을 글에 연결. 이후 질문 뱅크 기준으로 편집 캘린더 운영.", criterionIds: ["C2", "C4", "C5", "D3"], effort: "2~4주" }, + { priority: "P2", title: "표면 실측과 측정 인프라", detail: "강남언니·GBP·네이버 플레이스 NAP 대조표 작성, GA4 AI 유입 채널그룹, GSC AI Overviews 확인, 서버 로그의 AI 크롤러 히트 계측. Bing Webmaster 등록.", criterionIds: ["D1", "D2", "D4", "D5", "E1", "E2", "E3", "A6"], effort: "지속" }, + ], + notDoing: [ + { item: 'llms.txt 제작', reason: 'Google 공식(2026-06) 효과 0, 채택률 0.13%, 서버 로그에 요청 자체가 없음. 위약이다.' }, + { item: '"스키마 넣으면 AI가 인용합니다" 약속', reason: '인과 증거 없음. 스키마는 엔티티 식별을 돕는 위생 조치로만 설명한다.' }, + { item: '단발 조회로 순위·노출 보고', reason: 'LLM 답변 분산 10~34%. 반복 측정 + 신뢰구간으로만 보고한다.' }, + { item: '답변엔진 UI 자동 조회', reason: 'OpenAI·Perplexity 약관 위반. 주력 측정은 오너가 소유한 신호(로그·GA4)로 한다.' }, + { item: '네이버 블로그 증량', reason: 'blog.naver.com robots.txt가 AI 크롤링을 전면 금지. 글로벌 AI 답변 기여도 0. 네이버 AI 브리핑은 별도 트랙.' }, + ], +};