# task-3025 — 네이버 블로그/카페 1위 노출 글 분석 (벤치마킹)

**레벨**: Lv.3 · **팀**: dev4-team · **회장 승인 완료** (2026-08-26)
**저장소**: `Jeon-Jonghyuk/InsuRo` (`/home/jay/projects/InsuRo`, 기본 브랜치 **main**)

## ★ 회장 지시 (원문 취지)
> "네이버 블로그/카페 탭 1위 노출 글 분석 기능은???????  (강제새로고침 해도 안 보임)"

**맞다. 만든 적이 없다.** InsuRo 코드베이스에 관련 코드 **0건**이다. 이 태스크가 착수 1번이다.

### 회장 확정 요구사항
```
· 키워드를 넣으면 네이버에서 1위(상위) 노출된 글을 분석한다
· 블로그 / 카페 를 선택할 수 있다
· 분석 결과로 목표치를 제시한다:  키워드 개수 · 이미지 개수 · 글자수
· ★ 이미지 생성은 하지 않는다. "몇 장이 필요한지"만 보고한다
· ★ 유료 플랜 전용. 무료 플랜은 업그레이드 유도를 보여준다
```

## ★★ 크롤러를 새로 짜지 마라 — 이미 있다
별도 저장소 `/home/jay/projects/InfoKeyword` (브랜치 master, `afb417b`) `worker/crawler/`:
```
blog_search.py       네이버 블로그 검색결과 · 순위 · 광고 판별
                       search_blogs(keyword, top_n) · _parse_blog_item(item, rank, is_ad)
cafe_search.py       카페 검색 · 순위
                       count_cafe_badges(keyword, top_n) · _parse_cafe_item(item, rank)
blog_content.py      본문 텍스트 추출 (_extract_text · _get_body_scope)
related_keywords.py · autocomplete.py · search_ad.py
```

### ★ 선결 판단 — 이식이냐 API 호출이냐 (진행 전 결정하고 근거를 남겨라)
```
(a) 이식  InfoKeyword 크롤러를 InsuRo 로 복사·정리해 서버 내부에서 직접 호출
(b) 호출  InfoKeyword 를 서비스로 띄우고 InsuRo 가 HTTP 로 호출
```
**ANU 권고는 (a) 이식이다.** (b) 는 InfoKeyword 서비스가 상시 떠 있어야 하고 장애면 InsuRo 기능이
같이 죽는다. 다만 **네가 실물을 보고 (b) 가 낫다고 판단하면 그 근거를 대고 (b) 로 가도 된다.**
어느 쪽이든 **결정 근거를 보고서에 남겨라.**



## ★★★ 최우선 — 회장 재지시 (2026-08-27)
> "키워드 관련 **네이버 카페탭, 블로그탭 1위 글** 키워드 갯수 분석 및 글자수, 이미지수
>  분석해내는 거부터 완성해야 해. **UI 까지!!!**"

회장이 이 기능을 **다른 모든 작업보다 먼저** 완성하라고 지시했다.
이전 지시(2026-08-25) 이후 **커밋 0건**으로 방치돼 있었고, 회장이 화면에서 찾지 못해
*"강제새로고침 해도 안 보임"* 이라고 지적한 바 있다.

### ★ "UI 까지" 가 완료 기준이다
- 서버 API 만 만들고 끝내지 마라. **설계사가 화면에서 실제로 쓸 수 있어야 완료**다
- 2026-08-25 에 `/generate` 가 **서버만 완성되고 화면이 없어 실효 0** 이었던 전례가 있다.
  같은 실수를 반복하지 마라
- 완료 보고에 **실제 화면 스크린샷**(키워드 입력 → 결과 표시)이 없으면 완료로 인정하지 않는다

### 산출물 3종은 회장이 명시한 그대로다
```
1위 글에서:  키워드 개수  ·  글자수  ·  이미지 수
채널 선택:   네이버 블로그탭  /  카페탭
```

## ★★ 이것은 재개다 (2026-08-26 14:30 KST)
이전 세션은 **서버 OOM 으로 사망**했다(10:34 global oom-kill → cokacdir 서비스 전체 사망).
네 실수가 아니다.

### 반드시 지킬 것 — 오늘 실제로 사고가 났다
1. **worktree 를 써라.** 메인 저장소 `/home/jay/projects/InsuRo` 를 체크아웃 점유하지 마라.
   그 경로는 **cron 이 매일 06:00·08:00 에 직접 실행**한다. 오늘 다른 팀이 점유해 ANU 가 수동 복구했다.
2. **단계마다 커밋하라.** 오늘 죽은 4팀 중 2팀은 커밋 0이라 진척이 전부 사라졌다.
3. **메모리를 아껴라.** 서버 RAM 15GB, 봇 여러 팀이 동시 가동 중이다.
   유튜브 파이프라인이 **18:16 KST 에 실행**된다. 그 시간대 대용량 작업을 피하라.

### 현재 상태
브랜치는 있으나 **커밋 0건 · PR 없음**. 실질 진척 0 — 사실상 처음부터다.

## 만들 것

### ① 상위 글 수집
키워드 + 채널(블로그/카페) → 상위 N건. **광고는 제외**한다(`is_ad` 판별이 이미 있다).
- N 은 고정하지 말고 상수로 두어라(초기값 10 권장)
- 네이버 차단·타임아웃에 대비하라. **실패를 성공으로 표시하지 마라**

### ② 본문 분석 → 목표치 산출
수집한 상위 글에서 아래를 실측하고 **목표치로 환산**한다.
```
글자수      상위 글들의 실제 본문 길이 → 목표 범위(예: 중앙값 기준)
이미지 개수  본문 내 이미지 태그 수 → 목표 장수  ★ 생성하지 않는다. 개수만 보고
키워드 개수  대상 키워드가 본문에 몇 번 나오는가 → 목표 반복 횟수
```
- ★ **평균만 쓰지 마라.** 한 건이 극단값이면 평균이 무너진다. 중앙값·범위를 함께 제시하라
- 표본이 부족하면(수집 3건 미만 등) **"분석 불가"라고 말하라.** 억지 숫자를 만들지 마라

### ③ 플랜 게이팅
- **유료 플랜 전용.** 무료(플랜 1)는 실행 자체를 막고 **업그레이드 유도**를 보여준다
- ★ 게이팅은 **서버에서 강제**하라. 화면에서만 막으면 API 를 직접 부르면 뚫린다
- 기존 플랜 판정 로직(`PLAN_*`)을 따르라. 새 체계를 만들지 마라

### ④ 화면
키워드 분석(`/keyword-analysis`) 영역에 붙인다. 채널 선택 → 실행 → 결과(목표치 3종 + 근거가 된 상위 글 목록).
- 어떤 글을 근거로 삼았는지 **사용자가 확인할 수 있어야 한다**(제목·순위·링크)

## ★ 하지 말 것
- **이미지 생성 금지** (회장 명시). 개수 보고만
- 네이버 계정 로그인이 필요한 수집 금지
- 기존 키워드 분석·트렌드 파이프라인 로직 변경 (`daily_*.py` 는 t3019 결과물)
- `server/main.py` 대규모 수정 — 라우터는 **별도 파일**, 등록 1줄만
- 자격증명 값을 저장소에 커밋

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "server/routes/naver_benchmark_v1.py"
    - "server/naver_benchmark/**"
    - "server/tests/**"
    - "server/main.py"
    - "src/pages/KeywordAnalysis.tsx"
    - "src/components/keyword/**"
    - "src/**/__tests__/**"
    - "memory/reports/task-3025.md"
  forbidden_paths:
    - "server/scripts/daily_trend_collect.py"
    - "server/scripts/daily_health_check.py"
    - "server/scripts/daily_ranking_calc.py"
    - "server/scripts/alert_notify.py"
    - "server/policy_extract/**"
    - "server/policy_grouping/**"
    - "src/pages/NewDesignComparison.tsx"
    - "src/data/generateOptions.ts"
    - "extension/**"
    - ".github/workflows/**"
  commands: ["python3", "pytest", "npm", "npx", "bash", "gh"]
  merge_policy: "tiered"
  ttl_hours: 24
```
★ `server/main.py` 는 **라우터 등록 1줄만** 허용한다.

## 검증 (실측 강제 — 실 네이버로)
1. **실 키워드 2건 이상** 실행 — 블로그·카페 각각. 수집 건수 · 산출된 목표치 3종을 **실제 숫자로** 보고.
   목업 금지. 보험 관련 키워드로 하라(예: "실손보험 갱신")
2. **근거 글 목록** — 어떤 글이 표본이 됐는지 제목·순위를 제시하라
3. **광고 제외 확인** — 광고 글이 표본에 섞이지 않았음을 증명하라
4. **플랜 게이팅 서버 강제** — 무료 플랜 토큰으로 API 를 **직접 호출**해 차단되는지 확인하라.
   화면만 막고 API 가 열려 있으면 FAIL
5. **표본 부족 처리** — 수집이 실패하거나 적을 때 "분석 불가"가 뜨는지 확인
6. **회귀** — `pytest` · `vitest` **base 직접 재측정** 기준선
7. **봉인** — 플랜 게이팅을 무력화하는 변이를 만들어 테스트가 FAIL 하는지 확인·복원.
   변이가 no-op 이 아님을 `assert` 로 먼저 증명하라
8. **실 브라우저** — 실행부터 결과까지 스크린샷

## 완료 조건 (DoD)
**유료 플랜 사용자가 키워드와 채널을 고르면 실제 네이버 상위 글이 수집·분석되어
글자수·이미지 장수·키워드 반복 횟수 목표가 근거 글과 함께 제시되고, 무료 플랜은 서버에서 차단된다.**

## ★ 세션 조기 종료 대책
시작 즉시 브랜치 + 드래프트 PR 을 먼저 열어라. 단계마다 PR 본문에 진행을 갱신하라.
**①수집 → ②분석 → ③게이팅 → ④화면** 순으로 각 단계 끝에 커밋하라.
★ ANU 명세 전제가 틀렸다고 판단되면 구현하지 말고 **반증을 먼저 기록한 뒤 보고하라.**

## 운영 계약
- `origin/main`(=`14e9596`) 기준 `git pull --ff-only` 후 시작
- ★ `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 필수 (회장 개인 PAT 금지 — 감사기록 오염)
- 워크플로우 `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` · QC `/home/jay/workspace/teams/shared/QC-RULES.md`
- `WORKSPACE_ROOT=/home/jay/workspace` · `CHAT_ID=6937032012` · 수집자 key `ANU_KEY=c119085addb0f8b7`
- 완료 경로는 `finish-task.sh` 실행이 유일하다. 수동 `.done` 금지.
- ★ 병렬 3건 동시 진행 중(t3023 · t3024 · t3026). `server/main.py` 는 1줄만 건드려라

## 보고
**PR 생성까지가 범위다. 머지는 ANU 가 한다. 자동 머지 금지.**
`memory/reports/task-3025.md` 작성 후 표준 완료 콜백 등록. 콜백 프롬프트 **UTF-8 3900 bytes 이하**.
★ 봉투 첫 줄에 **"실 네이버 수집 성공 여부 + 플랜 게이팅 서버 강제 여부"** 를 담아라.