docs: 핸드오버에 도메인·레지스트리(§5-4) 반영 · §0 프롬프트 갱신

§0 프롬프트가 오늘 작업으로 낡았다. 브랜치 3개가 main 으로 합쳐졌고 작업 위치도
Productize-2(main)로 바뀌었다. 메인 체크아웃은 다른 작업의 미커밋 변경이 있어
건드리지 않는다는 것과, Supabase CLI 링크가 그쪽에만 있다는 것을 적었다.
결재 대기 중인 도메인 품의가 다음 세션의 첫 걸림돌이라 프롬프트 본문에 넣었다.

프롬프트에 원칙 두 줄 추가.
- 머지 직전에 브랜치 끝을 다시 읽는다. 오늘 이것을 놓쳐 첫 머지가 주변 안내와
  publish 단계를 떨어뜨렸다.
- 운영 DB 에 db push 를 쓰지 않는다. 이력이 실제와 어긋나 7개를 다시 실행하려 든다.

§5-4 신설: 주소 방식 결정과 근거, 지금 상태, 레지스트리에 넣은 컬럼·제약,
도메인 등록 후 순서(네임서버 위임 → --domain 재배포 → --indexable 은 붙이지 않음),
규모가 커질 때 대비할 것(병원 간 유사도 상한은 아직 없는 방어), DB 작업 주의.

§5 결정 대기 5번(도메인)을 결정으로 바꾸고, §7 파일 참조에 오늘 산출물을 넣었다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Haewon Kam 2026-09-14 11:37:08 +09:00
parent d4969da451
commit d847027bf2

View File

@ -7,12 +7,15 @@
``` ```
INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI 답변 준비도 진단(AEO/GEO v2) → 서포터즈 사이트 자동 빌드(글·영상·뉴스룸·회복 일정 플래너·오시는 길) → 병원 확인·재빌드 → 측정(질문뱅크·감성·GA4·크롤러 로그)" 파이프라인이다. INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI 답변 준비도 진단(AEO/GEO v2) → 서포터즈 사이트 자동 빌드(글·영상·뉴스룸·회복 일정 플래너·오시는 길) → 병원 확인·재빌드 → 측정(질문뱅크·감성·GA4·크롤러 로그)" 파이프라인이다.
코드 위치: 프런트·스크립트·문서는 메인 체크아웃 ~/Claude/Agentic Marketing/INFINITH (브랜치 feature/ai-sentiment-rubric, 프로덕션 main → infinith-demo.vercel.app), 코드 위치: 2026-09-12 에 브랜치 3개를 main 으로 합쳤다. 작업은 워크트리 ~/orca/workspaces/INFINITH/Productize-2 (브랜치 main) 에서 한다. 프로덕션은 main → infinith-demo.vercel.app.
워커·템플릿·큐는 워크트리 ~/orca/workspaces/INFINITH/Productize (브랜치 feature/supporters-autobuild), 랜딩 리드 CTA 는 브랜치 feature/discovery-url-cta(미머지). 메인 체크아웃 ~/Claude/Agentic Marketing/INFINITH 는 브랜치 feature/ai-sentiment-rubric 이고 다른 작업의 미커밋 변경(src/ 등 39줄, docs 폴더 재정리)이 있으니 건드리지 않는다. Supabase CLI 링크는 그쪽에만 있어 DB 조회는 거기서 supabase db query --linked 로 한다.
먼저 docs/NEXT_SESSION_2026-09-12_AI_DISCOVERY_PRODUCT.md 를 읽는다(§8 인사이트 포함). 시작 절차: (1) 두 저장소 git status 와 .vercel 연결을 확인하고 다른 세션이 열려 있지 않은지 haewon 에게 묻는다 (2) §1 표의 "확인" 칸을 git log·Supabase 로 실제 확인한다 (3) §5 결정 대기의 답을 받는다 (4) §4 순서대로 진행하되 1번 브랜치 통합을 먼저 끝낸다. 한 세션은 한 저장소·한 배포 대상만 다룬다. 먼저 docs/NEXT_SESSION_2026-09-12_AI_DISCOVERY_PRODUCT.md 를 읽는다(§5-4 도메인·레지스트리, §8 인사이트 포함). 시작 절차: (1) git status 와 .vercel 연결을 확인하고 다른 세션이 열려 있지 않은지 haewon 에게 묻는다 (2) §1 표의 "확인" 칸을 git log·Supabase 로 실제 확인한다 (3) §5 결정 대기의 답을 받는다 (4) §4 순서대로 진행한다. 한 세션은 한 저장소·한 배포 대상만 다룬다.
지금 걸려 있는 것: 도메인 webforai.kr 구매 품의가 결재 대기다(14,000원, docs/business). 결재가 나면 §5-4 순서대로 네임서버 위임과 세 사이트 주소 연결을 한다. 색인 허용(--indexable)은 법무 3건이 끝나기 전에는 붙이지 않는다.
원칙: 근거 없는 사실은 생성하지 않는다("확인 대기"). 사람 게이트(의학 검토·게시 승인·이미지 육안·채널 확인·구조 기준선)는 자동화하지 않는다. 언급률·점수는 "스키마를 넣으면 인용된다"고 약속하지 않는다(정직성 규약). 원칙: 근거 없는 사실은 생성하지 않는다("확인 대기"). 사람 게이트(의학 검토·게시 승인·이미지 육안·채널 확인·구조 기준선)는 자동화하지 않는다. 언급률·점수는 "스키마를 넣으면 인용된다"고 약속하지 않는다(정직성 규약).
고객 화면에 운영자 어휘 금지. 존댓말, 엠대시 금지(커밋 메시지 포함), 은유 금지, 흰 배경 위 연보라 텍스트 금지(인디고 #1D0024). INFINITH 리포트 PDF 는 PPTX 덱(infinith-deck 스킬)으로 만든 뒤 변환한다. 고객 화면에 운영자 어휘 금지. 존댓말, 엠대시 금지(커밋 메시지 포함), 은유 금지, 흰 배경 위 연보라 텍스트 금지(인디고 #1D0024). INFINITH 리포트 PDF 는 PPTX 덱(infinith-deck 스킬)으로 만든 뒤 변환한다.
클라이언트 격리: INFINITH 문서·코드에 다른 서비스 이름을 쓰지 않는다. 산출 전 grep. 클라이언트 격리: INFINITH 문서·코드에 다른 서비스 이름을 쓰지 않는다. 산출 전 grep.
머지 직전에 브랜치 끝을 다시 읽는다. 세션 시작 때 읽은 커밋 값은 머지 시점에 낡아 있을 수 있다. 머지 뒤 git rev-list --count main..<branch> 가 0 인지 확인하고, 통합 뒤 페이지 목록을 이전 배포와 대조한다.
운영 DB 에 db push 를 쓰지 않는다. 마이그레이션 이력이 실제와 어긋나 있다(docs/DB_SCHEMA_DIVERGENCE_2026-09-14.md). 새 마이그레이션은 supabase db query --linked --file 로 그 파일만 적용한다.
``` ```
## 1. 제품 여정과 현재 상태 ## 1. 제품 여정과 현재 상태
@ -93,7 +96,7 @@ INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI
2. **가격 티어**(§4-7)와 계약 최소 기간·해지 조건(2026-04 문서의 P0 두 항목이 그대로 미결). 2. **가격 티어**(§4-7)와 계약 최소 기간·해지 조건(2026-04 문서의 P0 두 항목이 그대로 미결).
3. ~~**뷰 샘플 통일**~~ **결정 (2026-09-12, haewon): 메인 `supporters/` 가 정본.** 템플릿은 `npm run export:template` 로 여기서 생성한다. 영어 홈 `/en` 은 템플릿에 추가했고 영문 사실이 없는 병원에서도 문장이 성립하도록 조각 단위로 조립한다(§5-2 판단 2). `view-supporters-sample` 배포 자리를 워커로 옮길지는 아직 안 정했다. 3. ~~**뷰 샘플 통일**~~ **결정 (2026-09-12, haewon): 메인 `supporters/` 가 정본.** 템플릿은 `npm run export:template` 로 여기서 생성한다. 영어 홈 `/en` 은 템플릿에 추가했고 영문 사실이 없는 병원에서도 문장이 성립하도록 조각 단위로 조립한다(§5-2 판단 2). `view-supporters-sample` 배포 자리를 워커로 옮길지는 아직 안 정했다.
4. **법무**: 외국인환자 유치업 등록 여부(플래너·숙소 링크), 의료광고 사전심의 대상 여부, 지원 관계 고지 문구(sponsorNotice). 이 세 가지는 색인 허용 전환의 전제. 4. **법무**: 외국인환자 유치업 등록 여부(플래너·숙소 링크), 의료광고 사전심의 대상 여부, 지원 관계 고지 문구(sponsorNotice). 이 세 가지는 색인 허용 전환의 전제.
5. **도메인**: 별도 도메인 vs 병원 서브도메인(설계 v0.1 §3 2안). 서포터즈 실명 모집 방식. 5. ~~**도메인**~~ **결정 (2026-09-14, haewon): 공용 도메인 `webforai.kr` 의 병원별 서브도메인.**`viewpl` · 원진 `wonjin` · 오라클 `oracle`. 구매 품의 결재 대기이고, 절차와 규모 대비는 §5-4 에 있다. 남은 미결은 `webforai.co.kr` 함께 확보할지, `webforai.com`(Afternic 파킹) 인수할지, 서포터즈 실명 모집 방식이다.
6. **워커 호스팅**과 GCP 계정(GA4 서비스 계정). 6. **워커 호스팅**과 GCP 계정(GA4 서비스 계정).
7. **규칙표 잠정값**: 뷰·원진·오라클 `procedures.json` 의 provisional 값(출국 최소일·입원·실밥)을 병원 확인 뒤 공개할지, 공개 전까지 "병원 확인 전" 배지로 둘지. 7. **규칙표 잠정값**: 뷰·원진·오라클 `procedures.json` 의 provisional 값(출국 최소일·입원·실밥)을 병원 확인 뒤 공개할지, 공개 전까지 "병원 확인 전" 배지로 둘지.
8. 서포터즈 빌드 하위 결정(하위 문서 §4)과 오라클 핸드오버 §3 미결은 그대로. 8. 서포터즈 빌드 하위 결정(하위 문서 §4)과 오라클 핸드오버 §3 미결은 그대로.
@ -153,6 +156,68 @@ INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI
| 오라클 이미지 | **0장.** 근거 수집일 2026-09-10 이 EUC-KR 디코딩(2026-09-11 반영)보다 하루 빨라 `images[].alt` 가 전부 `????` 로 깨졌고 분류기가 한 장도 고르지 못한다. **코드는 이미 고쳐져 있으므로 `--from evidence` 재수집이면 풀린다.** 다만 `oracleclinic.com` 이 응답하지 않는다(포트 80 연결 거부, 2026-09-12 기준). 그룹 사이트는 살아 있으나 Next.js 이미지 최적화 뒤에 있고 내용이 브랜드 배너·인증 마크라 대부분 제외 대상이다 | | 오라클 이미지 | **0장.** 근거 수집일 2026-09-10 이 EUC-KR 디코딩(2026-09-11 반영)보다 하루 빨라 `images[].alt` 가 전부 `????` 로 깨졌고 분류기가 한 장도 고르지 못한다. **코드는 이미 고쳐져 있으므로 `--from evidence` 재수집이면 풀린다.** 다만 `oracleclinic.com` 이 응답하지 않는다(포트 80 연결 거부, 2026-09-12 기준). 그룹 사이트는 살아 있으나 Next.js 이미지 최적화 뒤에 있고 내용이 브랜드 배너·인증 마크라 대부분 제외 대상이다 |
| 뷰 이미지 부족 | 제외 후 쓸 수 있는 것이 4장이라 글 5편 중 2편이 건물 사진으로 떨어진다. 병원 제공 시설 사진이 필요하다 | | 뷰 이미지 부족 | 제외 후 쓸 수 있는 것이 4장이라 글 5편 중 2편이 건물 사진으로 떨어진다. 병원 제공 시설 사진이 필요하다 |
## 5-4. 사이트 주소와 병원 레지스트리 (2026-09-14)
### 결정
서포터즈 사이트는 **공용 도메인 `webforai.kr` 의 병원별 서브도메인**에 둔다(haewon 2026-09-14).
병원마다 도메인을 사면 병원 수만큼 갱신 대상이 늘고 한 건만 놓쳐도 그 병원 사이트가 멈춘다.
근거와 리스크 비교는 `docs/business/INFINITH_서포터즈_사이트주소_방식비교_2026-09-14.docx` 에 있다.
병원 도메인의 서브도메인(`supporters.viewclinic.com`)은 제외했다. `viewclinic.com` 네임서버가 Cafe24 라
병원 웹 개발사 협조가 전제된다. 원진은 whoisdomain.kr, 오라클은 네임서버 응답이 없다.
### 지금 상태
| 항목 | 상태 |
|---|---|
| `webforai.kr` 구매 | **품의 결재 대기.** 14,000원. 품의서 `docs/business/INFINITH_품의서_webforai.kr_도메인구매_2026-09-14.docx` |
| `webforai.co.kr` | 미등록. 함께 확보할지 미결 |
| `webforai.com` | 이미 등록됨(Afternic 파킹). 인수 여부 미결 |
| `clinic_registry` 서브도메인 컬럼 | **적용 완료** (`supabase/migrations/20260914_clinic_subdomain.sql`) |
| 세 병원 배정 | **완료.**`viewpl` · 원진 `wonjin` · 오라클 `oracle` |
| 주소 연결 | 도메인 등록 후 |
### 레지스트리에 넣은 것
`clinic_registry` 가 서브도메인의 단일 원본이다. 코드가 이름을 매번 짓지 않는다.
수백 곳으로 늘면 "뷰"·"연세"·"그랜드" 처럼 여러 병원이 쓰는 이름에서 충돌이 난다.
- `subdomain`: 공용 도메인 앞 라벨. 소문자·숫자·붙임표, 2~40자, 붙임표 시작·끝 금지, 연속 붙임표 금지
- `clinic_slug`: 워커 `--clinic` 값. 빌드 폴더·Vercel 프로젝트 이름에 쓰여 서브도메인과 다를 수 있다(뷰는 `viewpl``viewclinic`)
- `subdomain_assigned_at`: 배정 시각
- 둘 다 대소문자 무시 유니크. 예약어 70여 개 차단(메일·인증 계열 `mx`·`dmarc`·`autodiscover`·`ns1` 포함)
예약어를 병원에 내주면 나중에 메일·API·관리 화면을 붙일 때 주소를 회수해야 하고,
회수 시점에는 이미 색인된 주소가 깨진다. 중복·예약어·형식 위반이 실제로 차단되는 것을 확인했다.
오라클피부과는 이 레지스트리가 성형외과 73곳으로 만들어져 등록돼 있지 않았다. 2026-09-14 에 넣어 74곳이다.
### 도메인 등록 후 순서
1. 등록기관에서 네임서버를 Vercel 로 위임한다. 존 전체를 위임하면 이후 서브도메인 추가에 사람이 DNS 를 만질 일이 없다.
2. 세 사이트를 주소와 함께 재배포한다. 워커가 `vercel domains add` 까지 한다.
`node workers/supporters-build/run.mjs --clinic viewclinic --url https://www.viewclinic.com --work ~/supporters-builds/viewclinic-test --from build --skip-generate --deploy --domain viewpl.webforai.kr`
원진은 `--clinic wonjin --domain wonjin.webforai.kr`, 오라클은 `--clinic oracle --domain oracle.webforai.kr`.
3. **`--indexable` 은 붙이지 않는다.** 법무 3건(외국인환자 유치업 등록, 의료광고 사전심의 대상 여부, 지원 관계 고지 문구)이 끝난 뒤 별도 품의로 올린다.
4. 연결 뒤 주소 응답과 noindex 헤더·메타·샘플 배너가 남아 있는지 확인한다.
### 규모가 커질 때 대비할 것
공용 도메인은 평판을 공유한다. 비슷한 틀의 콘텐츠가 수백 개 서브도메인으로 쌓이면
doorway 패턴으로 판정될 수 있고, 한 곳의 문제가 전체에 옮는다. 지금 없는 방어가 하나 있다.
- **병원 간 본문 유사도 상한을 발행 게이트에 추가한다.** 현재 `HOME_DUPLICATE` 는 같은 병원 안의 중복만 본다.
- 상위 도메인 첫 화면을 병원 목록으로 만들지 않는다. 나열하면 네트워크로 읽힌다.
- 전환이 필요해지는 경우는 병원이 자체 도메인을 요구하거나 평판 문제가 생길 때다. 전체를 옮기지 않고 해당 병원부터 옮긴다.
### DB 작업 시 주의
운영 DB 에 `supabase db push` 를 쓰지 않는다. 마이그레이션 이력에 10개 중 3개만 기록돼 있어
나머지 7개를 다시 실행하려 든다. 새 마이그레이션은 `supabase db query --linked --file <파일>` 로 그 파일만 적용한다.
대조표는 `docs/DB_SCHEMA_DIVERGENCE_2026-09-14.md` 에 있고, 정본은 마이그레이션 파일로 정했다(haewon 2026-09-14).
표 17개 중 15개는 일치하고 손볼 곳은 `clinic_registry` 하나와 정의가 빠진 뷰 2개다.
## 6. 함정 (제품 관점) ## 6. 함정 (제품 관점)
- **한 Vercel 프로젝트에 두 폴더**: 2026-09-11 Productize/supporters 와 메인 supporters 가 같은 프로젝트에 배포해 `/plan` 이 404 됐다. 지금은 Productize 쪽 연결을 껐다. 배포는 병원 폴더와 메인 supporters 에서만. - **한 Vercel 프로젝트에 두 폴더**: 2026-09-11 Productize/supporters 와 메인 supporters 가 같은 프로젝트에 배포해 `/plan` 이 404 됐다. 지금은 Productize 쪽 연결을 껐다. 배포는 병원 폴더와 메인 supporters 에서만.
@ -173,6 +238,8 @@ INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI
- 워커·템플릿: Productize `workers/supporters-build/`, `supporters/scripts/`, `templates/supporters-astro/`, 브리프 `supporters/briefs/<clinic>/` - 워커·템플릿: 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 - 플래너·지도: 템플릿 `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`, Productize `scripts/ga4_ai_traffic.py`, `data/ai_channels.json` - 측정: `scripts/run_question_bank_openai.py`, `scripts/sentiment_qb.py`, `docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.1.md`, Productize `scripts/ga4_ai_traffic.py`, `data/ai_channels.json`
- 사이트 주소·레지스트리: `supabase/migrations/20260914_clinic_subdomain.sql`, `docs/DB_SCHEMA_DIVERGENCE_2026-09-14.md`, `docs/business/INFINITH_서포터즈_사이트주소_방식비교_2026-09-14.docx`, 품의서 `docs/business/INFINITH_품의서_webforai.kr_도메인구매_2026-09-14.docx`
- 이미지 육안 검토: `supporters/scripts/build_image_review.mjs`, 대표 이미지 배정 `supporters/scripts/assign_post_heroes.mjs`
- 가격·경쟁: `docs/INFINITH_vs_FrostAI_비교_및_가격제안_2026-09-08.html`, `docs/INFINITH_가격정책_사업부보고서_v1.1.docx` - 가격·경쟁: `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` - 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`