From e52331a23927298bf1e8cacdd07ee71ea18d57aa Mon Sep 17 00:00:00 2001 From: Haewon Kam Date: Mon, 7 Sep 2026 14:28:40 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EC=84=9C=ED=8F=AC=ED=84=B0=EC=A6=88=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=B9=8C=EB=93=9C=20v2=20=C2=A711-4=20?= =?UTF-8?q?=EA=B7=BC=EA=B1=B0=20=EC=88=98=EC=A7=91=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D,=20=C2=A712=20haewon=20=EA=B2=B0=EC=A0=95=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20+=20=EB=B2=95=EC=A0=81=20=EC=B1=85=EC=9E=84=20?= =?UTF-8?q?=EC=A3=BC=EC=B2=B4=20=EC=A0=9C=EC=95=88=20+=20=EC=9B=8C?= =?UTF-8?q?=EC=BB=A4=C2=B7=EB=B0=B0=ED=8F=AC=20=EC=B6=94=EC=B2=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md | 72 ++++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md b/docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md index 736ea0a..1073396 100644 --- a/docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md +++ b/docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md @@ -235,9 +235,73 @@ INFINITH 저장소(브랜치 feature/discovery-url-cta)에서 "AI Discovery 자 ### 11-3. 남은 단계와 의존 관계 | 단계 | 상태 | 막는 것 | |---|---|---| -| 3 근거 수집기 (`evidence//*.json`) | 미착수 | 없음. Firecrawl 키는 `.env`에 있음(v1 §6). 뷰성형외과 6종 페이지(주의사항·애프터케어·검진·안전·시술 상세·의료진)로 회귀 | -| 4 글 생성 프롬프트 | 미착수 | §9-5 생성 모델·키·단가 상한 | -| 5 승인 UI (§6 입력 폼) | 미착수 | §9-2 폼 위치, §9-3 법적 책임 주체 | -| 6 워커·배포·랜딩 연결 | 미착수 | §9-6 워커 위치·배포 방식, `discovery_leads` 마이그레이션 미적용 | +| 3 근거 수집기 (`evidence//`) | **완료** (커밋 c92ecc8, §11-4) | 없음 | +| 4 글 생성 프롬프트 | 미착수 | 모델은 GPT-4로 결정(§12-1). 단가 상한 미정 | +| 5 승인 UI (§6 입력 폼) | 미착수 | 폼은 INFINITH 랜딩으로 결정(§12-1). 법적 주체는 §12-2 제안 확인 | +| 6 워커·배포·랜딩 연결 | 미착수 | §12-3 추천안 확인, `discovery_leads` 마이그레이션 미적용 | | 7 두 번째 병원 회귀 | 미착수 | §9-4 병원 선정 | | 「채널 인기 전체」 탭 | 경고만 | §9-1. 제거로 결정되면 `check.mjs`의 `level: R.W`를 지우고 videos.astro 탭을 뺀다 | + +### 11-4. 근거 수집기 (§7-3) · 커밋 c92ecc8 +- `supporters/scripts/collect_evidence.mjs --clinic --url <홈> [--posts src/content/posts]`. Node 22 + node-html-parser, Firecrawl·요약 도구 없이 curl+파서만(§3-10). +- 발견: 홈 전체 앵커(메뉴 제거 전) + `page` 사이트맵만(글·영상 post 사이트맵 제외). robots.txt Disallow 존중, 요청 간 400ms. +- 분류: 경로 세그먼트 우선, 단어 경계(`relocation`이 `location`에, `contour`가 `tour`에 걸리던 오분류 수정). 후보는 `수술 시간|마취|회복|실밥…` 힌트로 procedure/other. +- 본문: 컨테이너 후보(`main`, `#ajax-content-wrap`, `#content`…) 중 200자 넘는 첫 것 → 페이지 30% 이상에 반복되는 줄(메뉴·푸터) 제거 → 헤딩·문단·목록·표·이미지·링크. +- 산출: `index.json`(유형·글자·표·이미지·플래그), `pages/.json`, `doctors.json`, `facts.draft.json`(전화·주소·사업자번호·대표·진료시간 후보 + 출처 URL), `home_text.txt`(전 페이지 본문 공백 제거). +- 뷰성형외과 결과: 222 링크 → 223 페이지(정보형 유형 18 + 의료진 상세 27 + 시술 108 + 기타 70). 글에 인용된 병원 URL 16/16 커버(`/face/main/`은 301 → `/facial-contour/main/`). 의료진 27명 이름·직함 확인, **약력은 27명 전원 이미지 글자라 "확인 대기"** (authors.json의 약력은 사람이 이미지를 읽어 넣은 값이다. 자동화는 이 값을 만들 수 없다 → §6 입력 항목). +- 게이트 연결: `node scripts/check.mjs --home-text=../evidence/viewclinic/home_text.txt` → 18편이 전체 사이트 29만 자 기준 40자 연속 일치 0건. +- 한계: 홈 본문은 이미지·슬라이더라 0자(사실 후보는 전체 body에서 뽑아 정상). 주의사항 페이지는 탭 구조라 표가 0개이고 부위별 문장은 문단으로만 들어온다. 표 형태로 재구성하는 것은 글 생성기의 일. + +--- + +## 12. haewon 결정 반영과 제안 (2026-09-07 세션 2) + +### 12-1. 결정된 것 +| §9 항목 | 결정 | +|---|---| +| 9-2 입력 폼 위치 | **INFINITH 랜딩**. `/discovery/:id` 리포트 안에 "병원 확인 항목" 폼 | +| 검토 흐름 | **빌드를 다 한 뒤 클라이언트(병원)에 송부**. 자동 빌드는 승인 없이 끝까지 돌고, 미리보기(noindex)를 보낸 뒤 병원이 검토·승인 입력 | +| 9-5 생성 모델 | **GPT-4 계열** (`OPENAI_API_KEY` 있음). 단가 상한은 첫 배치 실측 후 정함 | +| 9-3 법적 주체 | 리서치 후 제안 → §12-2 | +| 9-6 워커·배포 | 추천 → §12-3 | +| 9-1 탭 제거, 9-4 두 번째 병원 | 미결 | + +### 12-2. 검토 승인의 법적 책임 주체 · 제안 +근거 조문을 원문으로 확인한 결과다(법률 자문이 아니며, 계약 전 변호사 확인을 권한다). + +**사실 1. 의료광고는 의료인등만 할 수 있다.** 의료법 제56조 제1항: "의료기관 개설자, 의료기관의 장 또는 의료인(의료인등)이 아닌 자는 의료에 관한 광고를 하지 못한다." 서포터즈 사이트는 병원의 지원(경제적 이해관계)을 받아 의료행위·의료기관 정보를 알리므로 의료광고로 볼 가능성이 높다. 따라서 **광고의 주체(법적 책임 주체)는 의료기관 개설자(뷰성형외과 대표원장)이고, AI오투오는 제작·운영 대행**이다. AI오투오가 자기 명의로 의료광고 주체가 되는 구조는 성립하지 않는다. + +**사실 2. 금지 유형이 사이트 규칙과 일치한다.** 제56조 제2항: 2호 치료경험담, 4호 다른 의료인과의 비교, 7호 심각한 부작용 등 중요 정보 누락, 8호 객관적 사실 과장, 14호 인증·추천 표현. 이미 §3-8 규칙과 게이트가 막고 있다. 새로 볼 것은 **10호 "기사 또는 전문가의 의견 형태로 표현되는 광고"**다. 서포터즈 글이 기사형·전문가 의견형으로 읽히면 이 호에 걸릴 수 있으므로, 광고(병원 지원)임을 숨기지 않는 표시가 방어선이다. + +**사실 3. 사전심의는 매체 기준이다.** 제57조 제1항: 신문·인터넷신문, 옥외광고물, 전광판, 대통령령이 정하는 인터넷 매체(앱 포함), 그 밖의 광고매체. 시행령 기준은 전년도 말 직전 3개월 일일 평균 이용자 10만 명 이상인 인터넷 매체·SNS. **자체 도메인의 신규 서포터즈 사이트는 이 기준에 들지 않아 법정 사전심의 의무는 없다.** 그러나 2트랙의 **네이버 블로그 재작성본은 10만 명 이상 매체라 게시물별 사전심의 대상**이다. 심의 신청은 의료기관 명의로 한다. + +**사실 4. 경제적 이해관계 표시.** 추천·보증 심사지침(2024-12-01 시행 개정): 금전 지원·할인·협찬을 소비자가 쉽게 알아볼 수 있게, 게시물 제목 또는 첫 부분에, 같은 언어로, 조건부 표현 없이 표시. 뷰성형외과는 2026-07-12 공정위로부터 수술비 할인 대가를 숨긴 후기 광고로 시정명령·공표명령을 받았다. 같은 유형의 위반이 재발하면 가중된다. + +**제안: 3층 책임 구조** +| 층 | 책임 주체 | 화면·기록 | +|---|---|---| +| 의료 내용 | 의료기관 개설자(대표원장). 글별 의학 검토는 담당 원장 | 글 하단 "의학 검토 {원장} ({일}) · 게시 승인 {개설자} ({일})". 승인 기록(승인자·직함·일시·글 버전 해시)을 DB에 남긴다. **자필 서명은 불필요**하고 승인 기록이 근거가 된다. 계약서에 "의료광고 주체는 의료기관 개설자, AI오투오는 제작·운영 대행, 법령·심의 준수 확인은 병원" 조항 | +| 편집·사실 확인·정정 | AI오투오 편집 책임자(안성민) | 현행 ReviewBox·/corrections 유지 | +| 경제적 이해관계 표시 | 병원(광고주)과 AI오투오(매체 운영) 공동 | **글 첫 부분에 고지 추가**(현행은 하단만). 문구 예: "이 글은 뷰성형외과의 지원(광고비)을 받아 뷰 서포터즈가 작성했습니다." 홈·소개에도 같은 문장 | + +**검토 흐름(haewon 결정 반영)**: 자동 빌드 완주 → noindex 미리보기 링크 송부 → 병원이 §6 입력 + 글별 검토자·검토일 + 개설자 게시 승인 → 승인된 글만 색인 허용 빌드(`PUBLIC_INDEXABLE=true`). 승인 전 글은 미리보기에서 "검토 대기"로만 보인다. 네이버 트랙은 여기에 의료광고심의위원회 심의를 한 단계 더 둔다. + +**코드로 옮길 것**: (1) 고지 상단 배치를 §3-8 규칙에 추가하고 게이트에 "글 첫 화면에 지원 고지 문장 존재" 검사 추가. (2) frontmatter에 `approvedBy`·`approvedAt`(개설자 승인) 필드 추가, 승인 없으면 색인 허용 빌드에서 제외. (3) 56조 2항 10호 대응으로 "기자·전문가 화법" 금칙(「본지」「기자」「전문가에 따르면」) 추가. + +### 12-3. 워커 위치·배포 방식 · 추천 +**부하**: 근거 수집 3분(220페이지) + 유튜브 집계 2분 + 뉴스 1분 + GPT-4 글 10~20편 5~20분 + astro build·게이트 30초 + Vercel 배포 1분 = **10~30분/병원**. Supabase Edge Function(150초)은 불가. Vercel Functions는 Hobby 300초 상한, Pro 800초(1,800초 베타). + +| 안 | 장점 | 단점 | +|---|---|---| +| A. Vercel Functions(Pro) + 단계 분할 + Vercel Cron 폴링 | 인프라 추가 없음 | 단계마다 800초 안에 끝내야 하고 상태 머신·재시도를 직접 만든다. 함수 안에서 `astro build`·의존성 설치가 부적합 | +| B. Inngest (무료 5만 run/월, 스텝 기반) | 재시도·관측 내장, Vercel 연동 | 각 스텝이 Vercel 함수로 실행되므로 A와 같은 시간·환경 제약 | +| **C. Trigger.dev v3 (추천)** | 전용 컴퓨트라 타임아웃 없음, Node 22에서 `npm ci`·`astro build`·Vercel API 호출을 한 태스크에서 순차 실행, 로컬 개발 도구 좋음, 오픈소스 셀프호스트 가능. 무료 1,500 run/월(월 빌드 수십 건이면 충분), 유료 $10/월~ | 서비스 하나 추가. 태스크 안에서 템플릿 의존성 설치가 되는지 첫 구현에서 확인 | +| D. 자체 Node 워커(VPS) + Supabase 큐 폴링 | 완전 통제 | 서버 운영·모니터링 부담. 빌드 수가 적은 지금 단계엔 과함 | + +**추천 구조**: Trigger.dev 태스크 `build-supporters(clinicId, url)` 하나가 9단계를 순서대로 실행하고, 단계마다 Supabase `supporter_builds`(id·단계·상태·로그·산출 경로·미리보기 URL)를 갱신한다. INFINITH 랜딩은 이 테이블을 폴링(또는 Supabase Realtime)해 진행 상태를 보여준다. 트리거는 `discovery_leads` insert → Supabase Database Webhook → Trigger.dev 이벤트. + +**배포**: 병원당 Vercel 프로젝트 `supporters-` (Vercel Multi-Project Platforms 패턴). 워커가 `astro build` + 게이트를 통과한 `dist/`를 Vercel Deployments API로 **prebuilt 업로드**한다(Vercel 쪽 빌드 없음, 빠르고 실패 지점이 적다). 환경변수 `SITE_URL`·`PUBLIC_INDEXABLE=false`, `X-Robots-Tag: noindex`는 vercel.json에 이미 있다. 도메인 확정 시 alias만 추가. 단일 프로젝트에 `//` 경로로 묶는 방식은 canonical·robots·sitemap이 병원별로 분리되지 않아 비추천. + +**입력 폼(INFINITH 랜딩)**: `/discovery/:id` 안 "병원 확인 항목" 탭 = §6 9항목 + 글별 검토자·검토일·개설자 승인. 저장 테이블 `supporter_inputs`(clinicId·항목·값·입력자·일시). 저장 시 데이터 파일(factSheet·authors·site·글 frontmatter)을 재생성하고 같은 태스크로 재빌드·재배포한다. 코드 수정 없이 데이터만으로 검토 완료·스키마가 켜지는 §10 완료 기준과 맞는다. + +**GPT-4 단가**: 글 1편 = 근거 컨텍스트 입력 약 6~10K 토큰 + 출력 약 3K 토큰. 모델은 `gpt-4.1` 또는 `gpt-4o` 중 고르며, 첫 배치 10편을 돌려 편당 비용을 실측한 뒤 상한(예: 병원당 첫 배치 총액)을 정한다. 회귀 기준은 뷰성형외과 18편(같은 문항·같은 근거로 생성 → 게이트 통과 + 세 줄 요약·표·FAQ 규격).