16 KiB
16 KiB
다음 세션 핸드오버 · 2026-09-12 · INFINITH AI Discovery Product 빌드
작성 2026-09-11 · 작성자 Claude (haewon 세션) · 상태: 초안(haewon 검토 전)
하위 문서: 서포터즈 사이트 빌드 절차 ~/orca/workspaces/INFINITH/Productize/docs/NEXT_SESSION_2026-09-12_PRODUCT_BUILD.md, 자동 빌드 상세 …/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v3.md, 자동 채점 docs/AI_DISCOVERY_BUILD2_HANDOVER.md, 회고 docs/INFINITH_AI_Discovery_Retrospective_2026-09-08.md.
0. 세션 시작 시 붙여 넣을 프롬프트
INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI 답변 준비도 진단(AEO/GEO v2) → 서포터즈 사이트 자동 빌드(글·영상·뉴스룸·회복 일정 플래너·오시는 길) → 병원 확인·재빌드 → 측정(질문뱅크·감성·GA4·크롤러 로그)" 파이프라인이다.
코드 위치: 프런트·스크립트·문서는 메인 체크아웃 ~/Claude/Agentic Marketing/INFINITH (브랜치 feature/ai-sentiment-rubric, 프로덕션 main → infinith-demo.vercel.app),
워커·템플릿·큐는 워크트리 ~/orca/workspaces/INFINITH/Productize (브랜치 feature/supporters-autobuild), 랜딩 리드 CTA 는 브랜치 feature/discovery-url-cta(미머지).
먼저 docs/NEXT_SESSION_2026-09-12_AI_DISCOVERY_PRODUCT.md 를 읽고, §1 표의 "확인" 칸을 git log·Supabase 로 실제 확인한 뒤, §5 결정 대기의 답을 받고 §4 순서대로 진행한다.
원칙: 근거 없는 사실은 생성하지 않는다("확인 대기"). 사람 게이트(의학 검토·게시 승인·이미지 육안·채널 확인·구조 기준선)는 자동화하지 않는다. 언급률·점수는 "스키마를 넣으면 인용된다"고 약속하지 않는다(정직성 규약).
고객 화면에 운영자 어휘 금지. 존댓말, 엠대시 금지(커밋 메시지 포함), 은유 금지, 흰 배경 위 연보라 텍스트 금지(인디고 #1D0024). INFINITH 리포트 PDF 는 PPTX 덱(infinith-deck 스킬)으로 만든 뒤 변환한다.
클라이언트 격리: INFINITH 문서·코드에 다른 서비스 이름을 쓰지 않는다. 산출 전 grep.
1. 제품 여정과 현재 상태
| 단계 | 고객이 보는 것 | 구현 | 위치 | 상태 |
|---|---|---|---|---|
| 1 진입 | /discovery 랜딩, "URL 입력으로 시작" |
DiscoveryLandingPage.tsx, DiscoveryLeadModal → Supabase discovery_leads |
메인, 브랜치 feature/discovery-url-cta | 프리뷰만. 미머지, 마이그레이션 20260831_discovery_leads.sql 적용 여부 확인 |
| 2 진단 | /discovery/:id 리포트 (AEO 100 + GEO 100, v2 기준표), 덱·PDF |
scripts/audit_aeo_geo.py(auto 22항목) → src/data/discovery_<id>.ts → DiscoveryReportPage.tsx; scripts/build_discovery_report.ts → HTML/PDF; 덱 빌더 docs/reports/<clinic>/01_readiness_report/build_*_deck*.py |
메인 + Productize(v2 기준표 src/data/aeoGeoRubricV2.ts, src/lib/discoveryScoreV2.ts) |
반자동. 결과가 소스 파일 커밋 방식이라 병원마다 코드 배포가 필요하다. v2 기준표가 main(프로덕션)에 머지됐는지 확인 |
| 3 서포터즈 사이트 | supporters-<clinic>.vercel.app 미리보기(noindex): 글·영상·뉴스룸·방문 안내(지도·길찾기)·회복 일정 플래너 /plan·/en/plan |
워커 workers/supporters-build/run.mjs 15단계(evidence→…→tourism→recovery→planner→…→deploy), 템플릿 templates/supporters-astro, 게이트 scripts/gate/rules.mjs |
Productize | 동작. 뷰(수작업 샘플 view-supporters-sample)·원진·오라클 3곳 배포. 병원당 약 $0.6, 30분 |
| 4 병원 확인 | /supporters/:id 또는 리포트 안 ClinicInputsPanel: 채널 확인, 의료진, 검토·승인, 자유 답변 |
Supabase supporter_builds·supporter_inputs, apply_inputs.mjs, 재빌드 run.mjs --from data --from-supabase --build-id |
메인(UI) + Productize(반영) | 동작하되 재빌드 자동 트리거 없음(supporter_inputs insert → 큐 연결 필요) |
| 5 운영 | 큐 → 빌드 → 미리보기 링크 | poll.mjs + Mac launchd 5분 폴러, supporter_builds 큐 |
Productize | 파일럿 수준. Mac 이 켜져 있어야 돈다. 실제 랜딩 신청 1건이 큐 → 완주까지 간 적 없음 |
| 6 측정 | 질문뱅크 언급률(2엔진), 감성, GA4 AI 유입, AI 크롤러 히트, 공식 vs 서포터즈 재채점 | scripts/run_question_bank_openai.py·merge_qb_results.py·sentiment_qb.py·ga4_ai_traffic.py, data/ai_channels.json, 리포트 Integrity 절 "측정 가능 범위" |
메인(QB·감성) + Productize(GA4) | 스크립트 단위. 리포트 카드 자동 갱신 없음. GA4 는 GCP 계정 대기 |
| 7 계약·가격 | 상담 기반 계약 | 가격 문서 docs/INFINITH_가격정책_사업부보고서_v1.1.docx(2026-04, 이전 제품 INSIGHT/INTELLIGENCE 티어), AI Discovery 가격 제안은 docs/INFINITH_vs_FrostAI_비교_및_가격제안_2026-09-08.html |
메인 | AI Discovery 전용 티어 미확정 |
2026-09-10~11 추가: 회복 일정 플래너 /plan(설계 v0.2 §13, 관광공사 데이터 합침), 주변 안내 /stay(장소·축제·동선 지도·날씨, 플래너와 별개 페이지로 복원), 오시는 길 지도·길찾기, 전역 언어 전환·영어 홈(뷰), 모바일 헤더, 발행(색인) 단계. 전부 템플릿·워커에 통합됨.
2. 코드·브랜치·배포 지도
| 무엇 | 어디 | 브랜치 | 배포 |
|---|---|---|---|
| 제품 프런트(랜딩·리포트·확인 패널) | 메인 src/ |
main(프로덕션), feature/ai-sentiment-rubric(감성·플래너 작업), feature/discovery-url-cta(리드 CTA) | infinith-demo.vercel.app (main 에서 vercel --prod, Gitea 자동 트리거 없음) |
| 채점·질문뱅크·감성·리포트 스크립트 | 메인 scripts/, docs/reports/ |
feature/ai-sentiment-rubric | 로컬 실행 |
| 워커·템플릿·게이트·GA4 뼈대·v2 기준표 | Productize workers/, supporters/, templates/, scripts/fetch_medical_tourism.py |
feature/supporters-autobuild | 병원별 supporters-<clinic> (워커가 강제 link) |
| 뷰 수작업 샘플 | 메인 supporters/ |
feature/ai-sentiment-rubric | view-supporters-sample 수동 |
| Supabase | supabase/migrations/ (supporter_builds, supporter_builds_queue, discovery_leads) + Edge Functions(기존 리포트 파이프라인) |
메인 | 적용 상태 확인 필요(CLI 토큰 만료 이력) |
| 키 | Productize .env(TOUR_API·NAVER·OPENAI·YOUTUBE), 메인 .env(진단·QB) |
회사 계정. 세션 시작 때 grep -E "^KEY=." .env 로 값 존재만 확인 |
세 브랜치는 서로 머지되지 않았다. supporters/ 폴더가 양쪽에 있고 Base.astro 구현이 다르다(메인: i18n.ts 전역 전환·영어 홈; Productize: langswitch·영어 입구 /en/plan). 플래너·지도·헤더 CSS 는 같다.
3. 지금 되는 것 / 안 되는 것 (한 줄씩)
되는 것
- 병원 이름·URL 로 채널 발견·근거 수집·자동 채점·리포트 HTML/PDF·덱(뷰·원진·오라클·태하 사례).
- 워커 한 번으로 서포터즈 사이트 초안 발행(글 6~8편, 영상, 뉴스룸, 이미지 규칙, 지도, 플래너, 관광공사 데이터). 게이트 41건 테스트.
- 병원 확인 패널 입력 → 수동 재빌드.
- 질문뱅크 120문항 2엔진 실측, 감성 판정, Before/After 페이지(
scripts/build_before_after.py).
안 되는 것
- 랜딩 신청 → 큐 → 빌드 → 미리보기 링크 회신이 사람 손 없이 이어지지 않는다(리드 테이블과 큐가 분리, CTA 브랜치 미머지).
- 진단 결과가 코드 파일(
discovery_<id>.ts)이라 병원마다 프런트 배포가 필요하다. 런타임 데이터(Supabase 또는 JSON 스토리지)로 옮겨야 "URL 입력 → 리포트 링크"가 된다. - 측정 지표가 리포트 카드에 자동으로 들어가지 않는다(스크립트 산출물을 사람이 옮긴다).
- 워커가 Mac 에 묶여 있다. 규칙표 잠정값·큐레이션 장소·의료진 후보·이미지·채널 12건은 사람 확인 대기.
- 색인 작업의 사람 몫(네이버 등록·GSC 소유자·도메인·법무)이 체크리스트 파일로만 나오고, 담당자에게 알림·요청하는 UI 가 아직 없다(§4-9).
- AI Discovery 가격·계약 조건 미확정. 랜딩 FAQ 의 해지·환불 항목 삭제 상태.
4. Product 빌드 순서 (권장)
- 브랜치 정리:
main기준으로 feature/supporters-autobuild(워커·템플릿·v2 기준표·GA4) → feature/ai-sentiment-rubric(감성·플래너·지도·설계 v0.2) → feature/discovery-url-cta(리드 CTA) 순으로 머지. 충돌 지점은supporters/(Base.astro 두 구현)와src/data/aeoGeoRubric*·discoveryScoreV2. 결정:supporters/는 템플릿(Productize) 구현을 정본으로 하고 뷰 샘플은 워커 폴더로 옮긴다(§5-4). - 리드 → 큐 연결:
discovery_leads마이그레이션 적용 → insert 시supporter_builds큐에 행 생성(DB 트리거 또는 폴러가 leads 도 읽기) → 워커가 evidence 부터 완주 → 미리보기 URL 을supporter_builds.preview_url에 기록 → 신청자에게 링크 회신(초기에는 수동 메일,o2oteam@o2o.kr). - 진단 결과 런타임화:
audit_aeo_geo.py출력 JSON 을 Supabase(discovery_results) 또는 스토리지에 저장하고/discovery/:id가 런타임에 읽는다. 기존DISCOVERY_RESULTS레지스트리는 샘플(뷰) 전용으로 남긴다. 사람 판정(v2Results 4항목)은 확인 패널에서 입력. - 재빌드 자동화:
supporter_inputsinsert → 큐 →run.mjs --from data --from-supabase. 색인 허용 빌드(PUBLIC_INDEXABLE=true)는approvedAt있는 글만 낸다는 규칙 유지. - 측정 카드: 질문뱅크·감성·GA4·크롤러 히트 결과를
discovery_results에 붙이고 리포트 Integrity 절과 Before/After 에 자동 표시. 언급률은 신뢰구간과 함께. - 운영 이관: Mac launchd 폴러 → Trigger.dev(또는 동등)로. 키·비용 로그(
status.jsoncostUsd)·실패 알림. - 가격·계약: AI Discovery 티어(진단만 / 진단+서포터즈 / +측정·관리) 확정, 랜딩 FAQ·계약서·해지 조건. FrostAI 비교 문서의 제안을 출발점으로.
- 다음 병원: 톡스앤필·차앤박(피부과), 레지스트리 73곳 중 회귀 병원. 한 화면 비교 산출물은 만들지 않는다.
- 발행(색인) 단계: "서포터즈 사이트 완료"의 정의는 배포가 아니라 색인 작업과 사람 체크리스트까지 끝난 상태다(haewon 결정 2026-09-11). 워커
publish단계(supporters/scripts/publish_site.mjs)가 자동으로 하는 것: 라이브 확인(홈·robots·sitemap·noindex 헤더), IndexNow 로 사이트맵 URL 전부 알림(빙·네이버 공용, 색인 허용 빌드일 때만), Google Search Console 사이트맵 제출과 URL 색인 상태 조회(서비스 계정GOOGLE_SERVICE_ACCOUNT_JSON있을 때), 검색엔진 소유 확인 메타 태그(site.jsongoogleSiteVerification·naverSiteVerification), IndexNow 키 파일(public/<key>.txt) 자동 생성,--indexable로 noindex 헤더 제거·승인 글만 발행,--domain으로 정식 도메인 연결. 사람에게 남기는 것(~/supporters-builds/<clinic>/publish-checklist.md,status.humanTasks): 네이버 서치어드바이저 등록·소유 확인·사이트맵/RSS 제출(공개 API 없음), Google Search Console 소유자 추가(첫 1회), 정식 도메인 결정, 색인 허용 전환 전 법무 3건·게시 승인, 병원 자산에서 백링크·sameAs, 네이버 블로그 재작성 트랙. 하지 않는 것: Google Indexing API(채용·라이브 방송 전용), 색인 보장 약속. 제품에서는 이 체크리스트를 확인 패널(ClinicInputsPanel) 또는 운영자 알림으로 사람에게 요청하게 만드는 것이 다음 일이다.
5. haewon 결정 대기
- Product 1.0 범위: (a) 진단 리포트만, (b) 진단 + 서포터즈 사이트 초안, (c) b + 측정·관리 구독. 랜딩 CTA 의 약속 범위가 달라진다.
- 가격 티어(§4-7)와 계약 최소 기간·해지 조건(2026-04 문서의 P0 두 항목이 그대로 미결).
- 뷰 샘플 통일: 메인
supporters/를 워커 폴더(~/supporters-builds/viewclinic)로 옮기고view-supporters-sample을 워커 배포로 바꿀지. 옮기면 뷰의 영어 홈/en은 템플릿에 없으므로 템플릿에 영어 홈을 추가할지 함께 결정. - 법무: 외국인환자 유치업 등록 여부(플래너·숙소 링크), 의료광고 사전심의 대상 여부, 지원 관계 고지 문구(sponsorNotice). 이 세 가지는 색인 허용 전환의 전제.
- 도메인: 별도 도메인 vs 병원 서브도메인(설계 v0.1 §3 2안). 서포터즈 실명 모집 방식.
- 워커 호스팅과 GCP 계정(GA4 서비스 계정).
- 규칙표 잠정값: 뷰·원진·오라클
procedures.json의 provisional 값(출국 최소일·입원·실밥)을 병원 확인 뒤 공개할지, 공개 전까지 "병원 확인 전" 배지로 둘지. - 서포터즈 빌드 하위 결정(하위 문서 §4)과 오라클 핸드오버 §3 미결은 그대로.
6. 함정 (제품 관점)
- 한 Vercel 프로젝트에 두 폴더: 2026-09-11 Productize/supporters 와 메인 supporters 가 같은 프로젝트에 배포해
/plan이 404 됐다. 지금은 Productize 쪽 연결을 껐다. 배포는 병원 폴더와 메인 supporters 에서만. - 페이지를 덮어쓰지 않는다: 플래너 통합 때
/stay(주변 안내)를/plan으로 리다이렉트해 세 사이트에서 주변 안내가 사라졌다(09-11 17시 복원). 새 기능이 기존 페이지와 '같은 주제'로 보여도 haewon 확인 전에는 기존 페이지를 지우거나 리다이렉트하지 않는다. - 세 브랜치 분산: 같은 파일(
supporters/)이 두 브랜치에서 다르게 진화했다. 머지 전에 "템플릿이 정본"을 정하고 뷰 샘플을 옮긴다. - 진단 결과가 코드:
discovery_<id>.ts커밋 방식은 병원 수가 늘면 배포 병목이다(§4-3). - 게이트는 고객 화면 전체를 본다: 운영 어휘("실측"·"API 집계"·"임베드")가 데이터 값을 타고 화면에 나가면 빌드가 막힌다. 운영 기록은 데이터에만.
- 원문 문장은 걸러야 한다: 병원 페이지 원문 32문장 중 14건이 홍보문·정형 고지였다. 워커 planner 단계 필터(CARE/NOT_CARE) 없이는 "병원 안내 기준" 배지가 의료광고 위반이 된다.
- 헤드리스 크롬 모바일 캡처: 창 최소 폭 때문에 400px 직접 캡처가 틀린다. 1280 창 안 390px iframe 하네스로.
- lint: 메인 체크아웃은 한때 tsc 가 없어
npm run lint가 가짜 통과였다. 실제 0 에러인지npx tsc --noEmit로 본다. - 엠대시·타 서비스 이름: 커밋 메시지와 문서에서 두 번 잡혔다. 산출 전 엠대시 검색(
grep -cP "\x{2014}")과 타 서비스명 격리 grep(전역 CLAUDE.md 의 목록).
7. 파일 참조
- 진단:
src/data/aeoGeoRubricV2.ts,src/lib/discoveryScoreV2.ts,src/pages/DiscoveryReportPage.tsx,scripts/audit_aeo_geo.py,docs/AEO_GEO_RUBRIC_v2.md - 랜딩·리드:
src/pages/DiscoveryLandingPage.tsx,src/components/discovery/,supabase/migrations/20260831_discovery_leads.sql - 확인 패널·큐:
src/components/discovery/ClinicInputsPanel.tsx,src/pages/SupportersBuildPage.tsx,supabase/migrations/20260907_supporter_builds*.sql - 워커·템플릿: Productize
workers/supporters-build/,supporters/scripts/,templates/supporters-astro/, 브리프supporters/briefs/<clinic>/ - 플래너·지도: 템플릿
src/components/Planner.astro·VisitMap.astro,src/lib/plan.ts·tour.ts,supporters/scripts/build_planner_data.mjs, 설계docs/INFINITH_Viewclinic_Supporters_Site_Design_v0.2.md§13 - 측정:
scripts/run_question_bank_openai.py,scripts/sentiment_qb.py,docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.1.md, Productizescripts/ga4_ai_traffic.py,data/ai_channels.json - 가격·경쟁:
docs/INFINITH_vs_FrostAI_비교_및_가격제안_2026-09-08.html,docs/INFINITH_가격정책_사업부보고서_v1.1.docx - PRD:
docs/prd/INFINITH_AI-Discovery_PRD_20260828_v02.md,docs/prd/INFINITH_Global_Medical_Hub_PRD_v0.1.html(Productize 에 v0.2),docs/prd/INFINITH_Dermatology_Supporters_PRD_v0.1.html