docs: 서포터즈 자동 빌드 v2 §11-4 근거 수집기 기록, §12 haewon 결정 반영 + 법적 책임 주체 제안 + 워커·배포 추천
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
c92ecc83fb
commit
e52331a239
@ -235,9 +235,73 @@ INFINITH 저장소(브랜치 feature/discovery-url-cta)에서 "AI Discovery 자
|
|||||||
### 11-3. 남은 단계와 의존 관계
|
### 11-3. 남은 단계와 의존 관계
|
||||||
| 단계 | 상태 | 막는 것 |
|
| 단계 | 상태 | 막는 것 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 3 근거 수집기 (`evidence/<clinic>/*.json`) | 미착수 | 없음. Firecrawl 키는 `.env`에 있음(v1 §6). 뷰성형외과 6종 페이지(주의사항·애프터케어·검진·안전·시술 상세·의료진)로 회귀 |
|
| 3 근거 수집기 (`evidence/<clinic>/`) | **완료** (커밋 c92ecc8, §11-4) | 없음 |
|
||||||
| 4 글 생성 프롬프트 | 미착수 | §9-5 생성 모델·키·단가 상한 |
|
| 4 글 생성 프롬프트 | 미착수 | 모델은 GPT-4로 결정(§12-1). 단가 상한 미정 |
|
||||||
| 5 승인 UI (§6 입력 폼) | 미착수 | §9-2 폼 위치, §9-3 법적 책임 주체 |
|
| 5 승인 UI (§6 입력 폼) | 미착수 | 폼은 INFINITH 랜딩으로 결정(§12-1). 법적 주체는 §12-2 제안 확인 |
|
||||||
| 6 워커·배포·랜딩 연결 | 미착수 | §9-6 워커 위치·배포 방식, `discovery_leads` 마이그레이션 미적용 |
|
| 6 워커·배포·랜딩 연결 | 미착수 | §12-3 추천안 확인, `discovery_leads` 마이그레이션 미적용 |
|
||||||
| 7 두 번째 병원 회귀 | 미착수 | §9-4 병원 선정 |
|
| 7 두 번째 병원 회귀 | 미착수 | §9-4 병원 선정 |
|
||||||
| 「채널 인기 전체」 탭 | 경고만 | §9-1. 제거로 결정되면 `check.mjs`의 `level: R.W`를 지우고 videos.astro 탭을 뺀다 |
|
| 「채널 인기 전체」 탭 | 경고만 | §9-1. 제거로 결정되면 `check.mjs`의 `level: R.W`를 지우고 videos.astro 탭을 뺀다 |
|
||||||
|
|
||||||
|
### 11-4. 근거 수집기 (§7-3) · 커밋 c92ecc8
|
||||||
|
- `supporters/scripts/collect_evidence.mjs --clinic <id> --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/<slug>.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-<clinicId>` (Vercel Multi-Project Platforms 패턴). 워커가 `astro build` + 게이트를 통과한 `dist/`를 Vercel Deployments API로 **prebuilt 업로드**한다(Vercel 쪽 빌드 없음, 빠르고 실패 지점이 적다). 환경변수 `SITE_URL`·`PUBLIC_INDEXABLE=false`, `X-Robots-Tag: noindex`는 vercel.json에 이미 있다. 도메인 확정 시 alias만 추가. 단일 프로젝트에 `/<id>/` 경로로 묶는 방식은 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 규격).
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user