# Task: InfoKeyword Step 5/6/7 개선 구현

## 프로젝트 경로
`/home/jay/projects/InfoKeyword/`

## 배경
- task-241.1에서 Step 2/3/4 크롤러 정확도 수정 완료 (related_keywords.py, autocomplete.py, search_ad.py, page.tsx)
- task-242.1에서 Step 5/6/7 개선 설계서 완성: `/home/jay/workspace/memory/specs/step567-improvement-spec.md`
- 이제 설계서를 바탕으로 실제 구현을 진행한다

## 구현 순서 (의존관계 반영)
### Phase 1: Step 7 (카페 뱃지) — 독립적, 가장 간단
### Phase 2: Step 5 (광고성 여부) — 핵심 변경
### Phase 3: Step 6 (외부 블로그) — Step 5 선행 필요

## 수정 대상 파일

### Worker 측
1. **`worker/crawler/blog_search.py`**
   - `_parse_blog_item()`: `rank`(1-based), `is_ad` 필드 추가
   - `_is_ad()`: 광고 감지 패턴 보완 (adcr.naver.com, ader.naver.com, "광고" 텍스트 라벨, ad_area/ico_ad 클래스)
   - `search_blogs()`: 광고를 제거하지 말고 is_ad 태깅만 하여 전체 리스트 반환

2. **`worker/crawler/cafe_search.py`**
   - `_parse_cafe_item()`: `rank` 필드 추가
   - `count_cafe_badges()`: `representative_positions` 리스트 추가

3. **`worker/pipeline/analyzer.py`**
   - `_step5_promotional()`:
     - is_ad=True 항목 → 분석 제외, ad_excluded_positions에 rank 기록
     - is_ad=False 항목 → 기존 분석 수행
     - 결과에 informational_count, ad_excluded_count, total_crawled, informational_positions, promotional_positions, ad_excluded_positions 추가
   - `_step6_external_blog()`: total_base, external_positions 추가
   - `_step7_cafe_badge()`: representative_positions 추가

### Frontend 측
4. **`src/types/index.ts`**
   - KeywordResult 타입에 step5/6/7 신규 필드 추가 (optional)

5. **`src/app/report/[id]/page.tsx`** — renderStepDetail() 수정
   - **Step 5**: 3영역 레이아웃
     - 영역A: 광고 제외 안내 배너 (광고 있을 때만)
     - 영역B: 정보성/홍보성 2분할 숫자 카드 + 순위 목록
     - 영역C: 블로그 상세 리스트에 [TOP N] 순위 배지, 광고는 [광고] 배지 + 흐리게
   - **Step 6**: "외부 블로그 N개 / TOP10 중" 카드 + 순위 배지 URL 목록
   - **Step 7**: "대표카페 N개 / TOP10 중" + Progress bar
     - "대표뱃지" → "대표카페" 레이블 변경

## 설계서 참조
모든 상세 스키마, UI 디자인, 코드 패턴은 아래 설계서에 있음:
`/home/jay/workspace/memory/specs/step567-improvement-spec.md`
→ 반드시 이 파일을 먼저 읽고 구현할 것

## 기존 데이터 호환성
- 기존 필드(pass, ratio, promotional_count 등) 절대 제거하지 말 것
- 신규 필드는 전부 optional (Firestore 기존 데이터에는 없으므로)
- Frontend에서 optional chaining(?.) 사용 필수

## 빌드 & 서버 재시작
- Worker 측은 Python이므로 빌드 불필요
- Frontend: `cd /home/jay/projects/InfoKeyword && npm run build`
- 빌드 성공 후 반드시 서버 재시작:
  1. `lsof -ti:3100 | xargs kill` (기존 서버 종료)
  2. `cd /home/jay/projects/InfoKeyword && PORT=3100 nohup npm run start > /tmp/infokeyword.log 2>&1 &`
- ⚠️ 빌드 후 서버 재시작 안 하면 구 코드가 서빙됨 (반복 발생한 이슈)

## QC 체크리스트
- [ ] 설계서 스키마와 구현이 일치하는지 확인
- [ ] 기존 필드 제거 없음 확인
- [ ] Frontend optional chaining 적용 확인
- [ ] npm run build 성공
- [ ] 서버 재시작 완료
- [ ] Python 크롤러 코드 문법 오류 없음 (python3 -c "import ..." 테스트)
