---
name: project_insuro_infokeyword_502_dotenv_order_task2925_merged_deployed_260807
description: InsuRo 정보성키워드 생성 502 hotfix(load_dotenv 순서 버그) task-2925 머지·라이브배포 완료
metadata:
  type: project
---

# InsuRo infokeyword 502 hotfix (#201 task-2925, 260807) MERGED·DEPLOYED

회장 긴급 장애: `POST /api/insuro/infokeyword/generate` 전면 502. 근본원인=키불일치 아님, **코드 순서 버그**.

- `server/main.py`: `_infokeyword_http_client`(구 41~45행)가 모듈 로드 시점에 `os.getenv("INFORKEYWORD_API_KEY","")`를 즉시 평가하는데 `load_dotenv(.env)`(구 52~54행)가 그 **뒤** → 빈 문자열("")이 X-API-Key 헤더에 박제 → worker(8100) 401 → 502.
- **수정(surgical)**: load_dotenv 3줄을 httpx 클라이언트 생성 **이전**(import 직후, 신규 41~42행)으로 이동. 동작 무변경(.env 하나만 로드 유지), 순서만 교정. 회귀 테스트 `server/tests/test_infokeyword_dotenv_order.py` 추가.
- **근본원인 입증**: import 시점 헤더 X-API-Key=21자(EMPTY=False). 수정본 서버→worker 직접 호출=**422**(body validation, NOT 401)=인증 통과. (엔드포인트 자체는 Supabase 실 JWKS admin JWT 필요→로컬 위조 불가, 무인증은 401 auth계층. 이게 환경 제약.)
- **머지**: PR #201 squash→main **f2b282e** (repo 이전됨: **Jeon-Jonghyuk/InsuRo**). CI 전 게이트 GREEN(ci/diagnostic/e2e/qc/gemini-gate/merge-safety/lock-in/hidden-path). 회귀 1299 passed(유일실패=pre-existing CORS test, base 재현). Green Path 자동머지.
- **라이브 배포**: `/home/jay/projects/InsuRo` main ff-pull→f2b282e. 수동 setsid uvicorn(PID 3320093) SIGTERM→**systemd `insuro-api.service`가 :8001 승계**(동일 WorkingDirectory=server, Restart=always). **이중구조(수동 vs systemd 크래시루프) 해소**=이제 systemd 관리 단일 프로세스. `/api/status` :8001·**api.insuro.biz 터널 200**, 배포서버 21자 키 로드 확인.
- 종결: finish-task(.done qc=WARN 전게이트 PASS)+result.json(authoritative=false, owner_pickup_required=true, self-fire 0)=ANU 독립 픽업 대기. ★ **server cwd 실행→result.json이 프로젝트경로 p0b_inbox로 감→workspace 정규위치 cp 보정**(기지 gotcha [[feedback_finish_task_worktree_cwd_p0b_result_path_260806]]). ★ **GOAL-GATE `import main` workspace root cwd서 FAIL→server cwd 재실행 PASS**([[feedback_finish_task_goal_gate_relative_pytest_cwd_260806]]).
