# task-3050 — 구글 트렌드 수집기 cron 자격증명 로드 누락 수정 (t3048 후속)

- **레벨**: Lv.1 (한 줄급 결함 수정 + 검증)
- **팀**: dev7-team
- **저장소**: `Jeon-Jonghyuk/InsuRo` · base `origin/main` (현재 `b6dad3a`)
- **선행**: task-3048 (PR#267 MERGED, ANU 가 메인 저장소 pull 까지 완료)

---

## S — 상황

task-3048 이 `run_trend_pipeline.sh` **Step 5** 로 구글 트렌드 수집을 배선했고,
ANU 가 PR#267 을 머지하고 `/home/jay/projects/InsuRo` 를 pull 해서 cron 이 실행하는
디스크 파일까지 반영을 마쳤다.

## C — 문제 (ANU 전수검사에서 발견)

**cron 환경에서는 자격증명이 로드되지 않아 매일 exit 4(config_error)로 실패한다.**
즉 지금 상태로 두면 내일 06:00 부터 구글 수집은 여전히 0건이고, 대신 실패 경보만 매일 발송된다.

ANU 재현 (cron 환경 그대로 시뮬레이션):

```
$ env -i HOME=/home/jay PATH=/usr/bin:/bin:/usr/local/bin bash -c \
    'source /home/jay/workspace/.env.keys 2>/dev/null; \
     cd /home/jay/projects/InsuRo/server && python3 scripts/collect_google_trends.py --dry-run'

  status        : config_error
  errors:
    - {'error': 'INSURO_NEW_SUPABASE_URL or INSURO_NEW_SERVICE_ROLE_KEY not set'}
[EXIT] 4 — 설정 오류 (자격증명 없음 / pytrends 미설치)
```

### 원인 (2단 직렬)

1. `server/trend_collector.py` 와 `server/scripts/collect_google_trends.py` 에
   **`load_dotenv` 호출이 0건**이다. `os.environ.get()` 만 한다.
2. `run_trend_pipeline.sh:41` 의 `source /home/jay/workspace/.env.keys` 는
   그 파일 50·52행에 **`export` 접두가 없어** 셸 변수로만 남고 python3 자식 프로세스에 전달되지 않는다.
   (스크립트가 명시 export 하는 것은 `COKACDIR_CHAT_ID`·`COKACDIR_KEY_FILE` 둘뿐)

### 기존 네이버 단계는 왜 되는가 (따라야 할 패턴)

`server/scripts/daily_trend_collect.py:36-40`

```python
from dotenv import load_dotenv
load_dotenv(dotenv_path=Path(__file__).resolve().parents[2] / ".env")
```

Step 1~4 는 전부 이렇게 **프로젝트 `.env` 를 명시 경로로 직접 로드**한다.
t3048 신규 파일 2개만 이 패턴을 빠뜨렸다.

## Q — 질문

cron 이 실제로 도는 환경(로그인 셸 환경 없음)에서 구글 수집이 자격증명을 얻는가?

---

## 지시

### 범위 (allowed_resources — 이 밖은 건드리지 말 것)

```
server/scripts/collect_google_trends.py
server/scripts/tests/test_google_trends_seal.py
```

- `server/trend_collector.py` 는 **수정하지 않는다.** 러너(CLI 진입점)에서 로드하면
  import 되는 `trend_collector` 도 같은 프로세스이므로 `os.environ` 을 공유한다.
  라이브러리 모듈에 부작용(import 시 dotenv 로드)을 넣지 않는 것이 더 단순하다. (Simplicity First)
- `run_trend_pipeline.sh` 도 **수정하지 않는다.** 셸에서 `set -a` 를 쓰면 `.env.keys` 전체가
  모든 자식 프로세스로 새므로 범위가 넓어진다. 러너 한 곳에서만 해결한다. (Surgical Changes)

### forbidden_paths

```
src/**              (프론트 무관)
server/main.py      (API 무관)
server/trend_collector.py
server/scripts/run_trend_pipeline.sh
그 외 server/scripts/*.py 전부
```

### 해야 할 일

1. `collect_google_trends.py` 최상단(다른 로컬 import 보다 먼저)에서
   `daily_trend_collect.py` 와 **동일한 패턴**으로 프로젝트 `.env` 를 로드한다.
   경로는 `Path(__file__).resolve().parents[2] / ".env"` — 하드코딩 금지.
   이미 환경변수가 설정돼 있으면 덮어쓰지 않는 기본 동작(`override=False`)을 유지한다.

2. 봉인 테스트를 1건 추가한다: **cron 환경(빈 env)에서 자격증명이 로드되는지**.
   - 파일 수정시각·"내가 실행해봤다" 류 서술이 아니라 **재현 가능한 subprocess 실행**으로 단언할 것.
   - 권장: `subprocess.run([sys.executable, runner, "--dry-run"], env={...최소 env...})` 후
     stdout 에 `config_error` 가 **없음**을 단언. 네트워크·실 수집 금지(`--dry-run` 사용).
   - ★ 변이가 no-op 이 아님을 증명할 것: 추가한 로드 줄을 제거하면 이 테스트가 **반드시 FAIL** 해야 한다.
     제거 전후를 실제로 실행해 증명하고 원복하라.

### 검증 (전부 수치로 보고)

1. **cron 환경 시뮬레이션 재현** — 위 `env -i ...` 명령을 그대로 실행해
   수정 **전** `config_error`, 수정 **후** 정상(dry_run) 임을 둘 다 붙일 것.
2. **실 cron 경로 실행** — `run_trend_pipeline.sh` 를 통째로 돌리지 말고(네이버까지 도는 것 방지),
   Step 5 와 동일한 명령을 `env -i` 로 감싸 `--dry-run` 으로 1회 실행해 exit 0 확인.
3. 회귀: `cd server && python3 -m pytest -q`
   - ANU 실측 기준선 (base `b6dad3a`, 워크트리 환경): **2906 passed / 5 skipped / 0 failed**
   - ★ 메인 저장소(`/home/jay/projects/InsuRo/server`)에서 돌리면 `.env` 때문에
     **5 failed** 가 나온다(CORS·standby 계열, 기존 환경 조건부 실패). 워크트리에서 측정하라.
4. 봉인 테스트 전체 실행 (기존 6건 + 신규) 전건 통과.
5. 실 수집은 **하지 말 것.** t3048 이 오늘 30키워드를 이미 수집했고(2026-08-28 KST 20:09 완료),
   구글 rate limit 을 또 건드릴 이유가 없다. dry-run 으로 충분하다.

### DoD

> cron 과 동일한 빈 환경에서 `collect_google_trends.py` 가 자격증명을 얻어
> `config_error` 없이 동작하고, 그 사실이 변이로 이빨이 증명된 테스트로 봉인된다.

### 머지 정책

**PR 생성까지가 범위. 머지 금지 — 머지는 ANU 가 한다.**
PR 본문에 t3048 후속임을 명시하고 PR 번호를 보고서에 남길 것.

### 알아둘 것

- e2e-test 체크는 **현재 main 이 이미 적색**이다(`new-design-comparison-honest-disclosure.spec.ts` 2건 +
  `task-2998-menu-consolidation.spec.ts` 1건). PR#266 과 실패 스펙이 동일하며 이번 변경과 무관하다.
  이걸 고치려 들지 말 것 — 범위 밖이다. 보고서에 "물려받은 적색"으로만 적어라.
- 콜백 cron prompt 는 **UTF-8 3900 bytes 이하**. `printf '%s' "$P" | wc -c` 로 측정할 것.
