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:
parent
d4969da451
commit
d847027bf2
@ -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`
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user