o2o-infinith-demo/docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v3.md
Haewon Kam 484601b0f5 feat(supporters): 뉴스룸 워커 단계 + 뉴스 게이트 규칙, launchd 폴러 설치
- collect_news.mjs: 네이버 뉴스 검색 다중 질의(상호·원장·의료진·주제어, 429 백오프) + 언론보도 게시판 자동 발견/clinic.json newsBoard.
  관련성 = 제목·요약에 병원 이름(v2 §8). 제목·매체·날짜·원문 링크만 저장. news_outlets.mjs 는 build_news.py 매체 표 이식
- gate: BANNED_NEWS_TITLE(전후 사진·비교, 후기, 변신)·NEGATIVE_NEWS(규제·사건, "무사고" 통과)·checkNewsItems → check.mjs·test.mjs(19/19)
- 워커 news 단계(youtube 뒤, images 앞), --news-board/--no-news, status.report.news
- 뷰 news.json: 렛미인 "변신" 기사 41건 규칙으로 제외(excludedByGate 에 목록). 회귀 1,105건(수작업 1,096, 제목 일치 1,033), 원진 1,049건
- launchd 폴러 설치(haewon 지시): PATH 에 프레임워크 python3, bootstrap/bootout 안내
- 함정: JS \W 는 한글을 지움(제목 중복 판정 붕괴), 워드프레스 article:published_time 은 게시판 생성일, 네이버 질의당 1,000건
- v3 문서 §1·§2·§3·§5·§6 갱신, 템플릿 재내보내기

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 14:14:08 +09:00

96 lines
11 KiB
Markdown

# 다음 세션 프롬프트 v3 · "병원 이름 하나로 진단 리포트와 서포터즈 사이트까지"
작성 2026-09-08 · 작성자 Claude (haewon 세션 핸드오버) · v2(09-07)를 대체한다. v2 §3 판단 분해표·§4 근거 프로토콜·§5 신뢰 층·§6 병원 입력·§11 진행 기록·§12 결정은 그대로 유효하므로 그 부분은 v2를 참조한다. v1(09-04)은 자산 위치·함정 참조용.
---
## 0. 세션 시작 시 그대로 붙여 넣을 프롬프트
```
INFINITH 저장소, 브랜치 feature/supporters-autobuild, 워크트리 ~/orca/workspaces/INFINITH/Productize 에서 "AI Discovery 자동 빌드"를 이어서 개발한다.
지금 상태: 병원 이름 또는 URL 하나로 채널 발견·엔티티 검증 → 근거 수집 → 팩트 시트 → 유튜브·로고 → 이미지(의료법 기준) → 첫 배치 기획 → GPT-4.1 글 생성(게이트·수치 대조·근거 대조) → Astro 빌드·발행 게이트 → Vercel 미리보기(noindex)까지 워커 한 번으로 돈다.
뷰성형외과(정답지 18편 회귀 18/18)와 원진성형외과(이름만 입력, 6/6편, https://supporters-wonjin.vercel.app)에서 사람 개입 0으로 완주했다. 진단 리포트는 /discovery/:id 와 docs/reports/<clinic>/01_readiness_report/*.html·pdf.
먼저 읽는다.
1. docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v3.md (이 문서. §2 남은 일과 §3 결정 대기)
2. docs/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v2.md §3·§4·§6·§11-5~§11-12 (규칙·근거 프로토콜·병원 입력·진행 기록)
3. workers/supporters-build/README.md, supporters/briefs/README.md, docs/INFINITH_Supporters_Image_Rules.md
4. docs/INFINITH_AI_Discovery_Retrospective_2026-09-08.md (회고. 왜 이렇게 만들었는지)
원칙: 근거 없는 사실은 생성하지 않는다("확인 대기"). 사람 게이트(의학 검토·게시 승인·채널 확인 필요·이미지 육안 확인)는 자동화하지 않는다. 고객 화면에 운영자 설명을 쓰지 않는다. 확정된 룩앤필은 텍스트만 바꾼다. 존댓말, 엠대시 금지, 은유 금지.
결정이 필요한 것은 §3을 보고 haewon 에게 묻는다.
```
---
## 1. 지금 되는 것 (한 줄씩)
| 단계 | 명령·파일 | 상태 |
|---|---|---|
| 채널 발견·엔티티 검증 | `supporters/scripts/discover_channels.mjs` (이름만으로 홈페이지도 찾음) | 원진 9플랫폼 중 8 CONFIRMED |
| 근거 수집 | `supporters/scripts/collect_evidence.mjs` (브라우저 UA, 슬래시 미강제, 404 재시도) | 뷰 223p · 원진 216p |
| 자동 채점·리포트 | `scripts/audit_aeo_geo.py` → `src/data/discovery_<id>.ts` → `/discovery/:id` · `scripts/build_discovery_report.ts` → HTML/PDF | 뷰 AEO 42/GEO 56 · 원진 AEO 15/GEO 45 |
| 유튜브·로고 | `collect_youtube.mjs`, 워커 youtube 단계, 고정값 `supporters/briefs/<id>/clinic.json` | 원진 736편 집계, @wjwonjin 고정 |
| 이미지 | `collect_images.mjs` + `img_process.py`, 규칙 `docs/INFINITH_Supporters_Image_Rules.md` | 원진 66장 |
| 뉴스룸 | `collect_news.mjs`(네이버 뉴스 검색 다중 질의 + 언론보도 게시판 자동 발견) → 워커 news 단계, 게이트 `checkNewsItems` | 뷰 회귀 1,105건(수작업 1,096, 제목 일치 1,033, 종류 분포 기고 768/732 · 보도자료 101/107 · 언급 236/257) · 원진 1,049건(게시판 없음). 09-08 |
| 기획·생성·게이트 | `default_briefs.mjs` → `generate_posts.mjs`(gen/) → `gate/rules.mjs`·`check.mjs`(테스트 16/16) | 편당 약 $0.09 |
| 워커·큐·승인 UI | `workers/supporters-build/run.mjs`·`poll.mjs`, `supporter_builds`·`supporter_inputs`, `ClinicInputsPanel`(/discovery/:id·/supporters/:id) | 라이브. **폴러 설치됨(2026-09-08, Mac launchd 5분, 로그 `~/supporters-builds/poll.log`)**. Mac이 켜져 있어야 돈다 |
| 입력 반영 | `apply_inputs.mjs` (검토·승인 → frontmatter, 자유 답변 → clinicAnswers 근거 [A]) | dry-run 검증 |
| 미리보기 | supporters-viewclinic.vercel.app · supporters-wonjin.vercel.app (noindex) | 배포됨 |
## 2. 남은 일 (권장 순서)
1. ~~뉴스룸 단계~~ **완료(09-08)**: `collect_news.mjs` + 워커 `news` 단계(youtube 뒤, images 앞). 관련성 = 제목·요약에 병원 이름(v2 §8 반영). 제외 규칙은 게이트와 같은 정규식(`BANNED_NEWS_TITLE` 전후 사진·비교·후기·변신, `NEGATIVE_NEWS` 규제·사건, "무사고"는 통과). 뷰 수작업 news.json에서 렛미인 "변신" 기사 41건이 이 규칙으로 빠졌다(`excludedByGate`에 목록). 원진 홈페이지에는 언론 게시판이 없어 네이버만. `build_news.py`는 참조용으로 남김. **남은 판단(§3-6)**: "언론 언급"(병원 이름이 요약에만 나오는 기사, 원진 514건)을 뉴스룸에 보일지.
2. **감사 재실행 단계(Phase 9)**: 색인 허용 빌드를 로컬에서 `audit_aeo_geo.py`로 다시 채점해 공식 vs 서포터즈 비교표를 리포트 카드에. `scripts/build_supporters_audit_xlsx.py` 로직 재사용.
3. **수동 실측 항목 채우기(원진)**: 강남언니 2500·바비톡 3143·GBP·네이버 플레이스 NAP 대조(D1·D2·D4·D5). 실측하면 GEO 점수가 바뀐다. 리포트 재생성은 `npx esbuild scripts/build_discovery_report.ts ... && node report.mjs --id wonjin ...` + Chrome PDF (v2 §11 명령 참조).
4. ~~워커 상시 실행~~ **완료(09-08)**: Mac launchd 폴러 설치(haewon 지시). 해제 `launchctl bootout gui/$(id -u)/com.infinith.supporters-poll`. Trigger.dev 이관은 월 수십 건이 되면. 실제 랜딩 신청 1건으로 큐 → 빌드 완주를 아직 못 봤다(큐가 비어 있었음). 첫 신청이 오면 `poll.log`를 본다.
5. **병원 송부 전 사람 확인**: 원진 이미지 갤러리 육안 확인(얼굴·신체 검출 없음), "확인 필요" 채널 12건 판정, 쇼츠 정리 답(사람이 영상 보고 한 문단).
6. **검토 파이프라인**: 병원이 `/supporters/wonjin` 폼에 입력 → `run.mjs --from data --from-supabase --deploy --build-id 87cb75a2-2037-4cbb-ae27-c06e39f022e8` 재빌드. 이 재빌드도 폴러가 자동으로 집게 하려면 supporter_inputs insert 트리거를 큐에 연결.
7. **뷰성형외과 자동 빌드 미리보기**(supporters-viewclinic)를 수작업 샘플(view-supporters-sample) 수준으로: 뷰는 자막·쇼츠 답이 사람 작업이라 격차가 있다. 자막 파이프라인(v1 §6, IP 차단 대비)이 붙어야 좁혀진다.
8. 세 번째 병원 회귀(`data/clinic_social_registry.json` 73곳 중 선택). 사이트마다 새 편차가 나온다는 전제로.
## 3. haewon 결정 대기
1. 원진 "확인 필요" 채널 12건 중 병원 것(영문 채널 Wonjin Plastic Surgery Korea, WONJIN_OFFICIAL 등)을 사이트에 연결할지.
2. 지원 관계 고지 문구(site.sponsorNotice)를 켤지와 문안. 켜면 글 첫 부분에 노출되고 게이트가 필수 검사로 바뀐다(v2 §12-2).
3. ~~워커 상시 실행 위치~~ 결정됨(09-08): 파일럿은 Mac 폴러. Trigger.dev는 정착 단계에.
4. 원진에 미리보기·리포트 송부 시점과 병원 입력 담당자.
5. 경영진 미결 그대로: 도메인(별도 vs 서브도메인), POC 범위·가격, 서포터즈 실존 개인 모집.
6. 뉴스룸 "언론 언급" 종류(mention)를 보일지. 병원이 알린 기사·원장 기고만 남기면 원진은 1,049건 중 535건이 된다. 보이면 관계사(WJ코스메틱)·투자·대학 기사가 섞인다. 기본값은 지금처럼 보이되 뒤로 정렬.
## 4. 이번 세션들(09-07 세션 3 ~ 09-08)에서 확정한 것
- 채널 인기 전체 탭 제거 · 단가 상한 실행당 $10 · 두 번째 병원 원진 · 유튜브 기준 채널 @wjwonjin · 이미지는 의료법 기준 조건부 제외(전후·사례·모델·비교·수상·수술 장면·신체 실사) · 병원별 고정값 파일 `supporters/briefs/<id>/clinic.json`.
- 랜딩 SampleReport 라벨 "SAMPLE REPORT · 실제 사례". URL 신청 → `supporter_builds` 큐. `/supporters/:id` 페이지.
## 5. 함정 (v1 §6·v2 §8에 추가)
- 사이트 편차 3종(원진): 비브라우저 UA 403, 경로 끝 슬래시 404, 주의사항·안전 페이지 없음. "한 병원에서 되는 코드"는 회귀 전까지 코드가 아니다.
- 역링크 판정은 경로 경계까지. 부분 문자열이면 변형 핸들이 전부 확인됨으로 잡힌다.
- 투명 PNG는 흰 배경으로 평탄화한 뒤에 글자 이미지 검사. 순서가 바뀌면 장식 오브젝트가 통과한다.
- 모델 근거 대조기는 "근거에 있다"고 적으면서 플래그를 세운다. 항목별 supported 판정으로 거른다.
- 게이트는 영상 제목도 본다. "부작용은 없을까?" 제목이 홈·영상 페이지에서 배포를 막았다. 수집 단계에서 같은 규칙으로 거른다.
- 인터넷이 끊기면 생성 단계가 fetch failed 로 멈춘다. `--from generate` 로 재개.
- JS 정규식 `\W`·`\w`·`\b`는 한글을 문자로 보지 않는다. Python 스크립트를 옮길 때 제목 정규화에 `\W`를 쓰면 한글 제목이 전부 같은 키로 뭉쳐 중복으로 버려진다(뉴스 수집기에서 445건 중 397건이 사라졌다). `[^\p{L}\p{N}]`에 `u` 플래그.
- 워드프레스 게시판의 `article:published_time` 메타는 글이 아니라 게시판 페이지 생성일이다. 글 날짜는 "작성일" 셀에서 읽고 메타는 마지막 후보로.
- 네이버 검색 API는 질의당 최근 1,000건, 초당 10건. 여러 질의(상호·상호 원장·상호+의료진·상호+주제어)로 넓히고 429는 물러났다 다시.
- `node --experimental-strip-types` 는 확장자 없는 import 를 못 푼다. TS 스크립트는 esbuild 번들로 돌린다.
## 6. 자주 쓰는 명령
```
# 새 병원 전체 (이름·URL·로고)
node workers/supporters-build/run.mjs --clinic <id> --url <홈> --name <상호> --logo <svg> --deploy --build-id <supporter_builds.id>
# 특정 단계부터 (evidence data discover youtube images inputs briefs generate build deploy)
node workers/supporters-build/run.mjs --clinic <id> --url <홈> --work ~/supporters-builds/<id> --from <단계> --deploy --build-id <id>
# 큐 비우기 / 상주
node workers/supporters-build/poll.mjs [--loop 300]
# 뉴스룸만 다시 (supporters/). 게시판은 자동 발견, 없으면 --board 또는 briefs/<id>/clinic.json newsBoard
node scripts/collect_news.mjs --clinic <id> --url <홈> --name <상호> --site ~/supporters-builds/<id>/site
# 게이트 테스트 · 뷰 정답지 회귀 · 템플릿 내보내기 (supporters/)
npm run gate:test · npm run generate:regress · npm run export:template
# 진단 리포트 HTML/PDF
npx esbuild scripts/build_discovery_report.ts --bundle --platform=node --format=esm --outfile=/tmp/report.mjs && node /tmp/report.mjs --id <id> --out <html> --status ~/supporters-builds/<id>/status.json --site ~/supporters-builds/<id>/site --briefs ~/supporters-builds/<id>/briefs.json
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --no-pdf-header-footer --virtual-time-budget=8000 --print-to-pdf=<pdf> file://<html>
```