- 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>
96 lines
11 KiB
Markdown
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>
|
|
```
|