버튼만 두면 무엇에 동의하는지 모른 채 누르게 된다. 진단을 요약하고, 이 빌드가 무엇을 보완하는지 말한 뒤 누르게 한다. 처음 만든 판은 실행 항목을 카테고리로 갈라 "이 빌드로 채워지는 항목 5건"이라고 했는데 그 5건이 깨진 JSON-LD 수정·GBP 전화번호 등록·H1 재설계처럼 전부 병원 홈페이지 몫이었다. 카테고리는 무엇에 관한 문제인지를 말할 뿐 누가 고치는지를 말하지 않는다. 지키지 못할 약속이라 프레임을 바꿨다. 빌드는 홈페이지를 한 줄도 고치지 않는다. AI가 인용할 새 표면을 하나 더 만들어 약한 카테고리(콘텐츠·엔티티·표면)를 우회 보완할 뿐이다. 화면도 그렇게 말한다. "이 빌드가 대신할 수 없는 것"으로 실행 항목이 그대로 병원 몫임을 밝힌다. - 다크 섹션 위 주 버튼을 .btn-on-dark 로 뺀다. 기본 CTA 그라디언트(#4F1DA1→#021341)는 끝 색이 배경(#0A1128)과 거의 같아 버튼으로 읽히지 않았다. 밝은 보라와 글로우로 떼어 놓는다. - 문구에서 "결과"를 뺀다. 빌드가 끝나도 사진 확인과 확인 항목이 남아 최종이 아니고, 누른 적 없는 사람에게 "결과 보기"부터 보이는 것도 맞지 않는다. - 이전 단계로 가는 플로팅 버튼을 왼쪽 아래에 고정한다. 오른쪽 아래는 주 행동 자리이고, 좁은 화면에서는 상단 절차 메뉴가 가로 스크롤 안으로 밀린다. 첫 단계에서는 띄우지 않는다. - 떠 있던 승인 바와 BuildSiteCta 는 이 섹션과 역할이 겹쳐 지운다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
48 lines
2.4 KiB
TypeScript
48 lines
2.4 KiB
TypeScript
/**
|
|
* 서포터즈 사이트 빌드가 진단의 어느 약점을 보완하는지 고른다.
|
|
*
|
|
* 중요한 전제. 이 빌드는 병원 홈페이지를 한 줄도 고치지 않는다. 별도 사이트를 하나 만들 뿐이다.
|
|
* 그래서 진단의 실행 항목(깨진 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<string, { now: string; fix: string }> = {
|
|
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,
|
|
}));
|
|
}
|