/** * 서포터즈 사이트 빌드가 진단의 어느 약점을 보완하는지 고른다. * * 중요한 전제. 이 빌드는 병원 홈페이지를 한 줄도 고치지 않는다. 별도 사이트를 하나 만들 뿐이다. * 그래서 진단의 실행 항목(깨진 JSON-LD 수정·GBP 전화번호 등록·H1 재설계 등)은 단 하나도 * 이 빌드로 해결되지 않는다. 전부 병원 몫이다. * * 빌드가 하는 일은 다르다. AI가 인용할 수 있는 새 표면을 하나 더 만들어, 홈페이지를 고치지 않고도 * 답변·출처로 쓰일 텍스트를 확보한다. 그래서 "실행 항목 중 몇 건 해결"이 아니라 * "어느 약점을 우회해서 보완하는가"로 말해야 한다. */ import type { CategoryId, CategoryScore } from '../types/discovery'; /** 빌드가 보완할 수 있는 카테고리. 크롤러 접근(A)·측정(E)·기술 위생(F)은 홈페이지 쪽이라 손댈 수 없다. */ const ADDRESSABLE: CategoryId[] = ['content', 'entity', 'surface']; /** 카테고리별로, 빌드가 무엇을 만들어 어떻게 보완하는지 */ export const COVERAGE_PLAN: Record = { content: { now: '패시지 단위로 인용할 문장이 없습니다', fix: '병원을 알아보는 사람이 실제로 묻는 질문을 골라, 한 단락만 떼어내도 뜻이 통하는 글로 답합니다.', }, entity: { now: '누가 말하는지 기계가 확정하지 못합니다', fix: '의료진 이력과 병원 사실을 한자리에 모으고, 글마다 작성자와 감수 원장을 구조화해 밝힙니다.', }, surface: { now: 'AI가 인용할 표면이 좁습니다', fix: '원장 설명 영상과 언론 보도를 글의 근거로 연결하고, 회복 일정과 방문 안내를 별도 페이지로 만듭니다.', }, }; export type WeakSpot = { id: CategoryId; name: string; pct: number; now: string; fix: string }; /** 빌드가 보완할 수 있는 카테고리 중 점수가 낮은 순 */ export function weakSpots(categories: CategoryScore[]): WeakSpot[] { return categories .filter((c) => ADDRESSABLE.includes(c.category.id) && COVERAGE_PLAN[c.category.id]) .sort((a, b) => a.pct - b.pct) .map((c) => ({ id: c.category.id, name: c.category.name, pct: c.pct, now: COVERAGE_PLAN[c.category.id].now, fix: COVERAGE_PLAN[c.category.id].fix, })); }