# task-2009 완료 보고서: InsuRo 리쿠르팅 CTA 고도화 (RC-3~4)

**팀**: dev3-team (다그다)
**일시**: 2026-04-20
**레벨**: normal

---

## SCQA

**S**: InsuRo에 RC-1(CTA 변형 3종)과 RC-2(CTA 노출 정책)가 구현되어 LockedFeatureOverlay에서 잠금 클릭 시 리쿠르팅 CTA가 표시된다.

**C**: 행동 기반 트리거(RC-3)가 없어 모든 사용자에게 동일한 CTA 정책만 적용되며, 전환 퍼널 데이터(RC-4)가 없어 잠금클릭→합류 경로의 전환율을 측정할 수 없다.

**Q**: 행동 기반 CTA 트리거와 전환 퍼널 이벤트 로깅을 구현하여 타겟팅된 CTA 노출과 퍼널 측정이 가능한가?

**A**: RC-3(행동 기반 엔도우먼트 CTA: 3조건 중 2개 충족 시 발동)과 RC-4(recruiting_inquiry 테이블 + 5단계 전환 퍼널 이벤트 로깅)를 구현 완료. localStorage 기반 행동 추적, Supabase migration, FastAPI API 2개, 프론트 퍼널 로거를 신규 생성하고 LockedFeatureOverlay에 통합. TypeScript tsc 에러 0건, FastAPI /api/status 200 OK, 새 엔드포인트 2개 401 정상 응답 확인.

---

## 구현 상세

### RC-3: 행동 기반 엔도우먼트 CTA 트리거
- `behaviorTracker.ts`: localStorage 기반 3조건 추적 (핵심기능 3회+, 7일+ 접속, 비교페이지 2회+)
- `useBehaviorCta.ts`: React 훅 — 마운트 시 접속일 자동 기록, 조건 충족 여부 반환
- `LockedFeatureOverlay.tsx`: behaviorCtaTriggered 시 "활동 기반 추천" 뱃지 표시

### RC-4: recruiting_inquiry 테이블 + 전환 퍼널
- Supabase migration: recruiting_inquiry 테이블 (7컬럼 + CHECK 제약 + RLS 3정책 + 복합 인덱스)
- `POST /api/insuro/recruiting/inquiry`: 문의 생성 (JWT 필수, 30/min rate limit)
- `GET /api/insuro/recruiting/funnel`: 본인 퍼널 데이터 조회
- `recruitingFunnel.ts`: 프론트 퍼널 이벤트 로거 (5단계: lock_click→intro_page→inquiry→consultation→joined)

---

## 수정 파일 목록

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| supabase/migrations/20260420300000_recruiting_inquiry.sql | recruiting_inquiry 테이블 생성 | grep "recruiting_inquiry" OK (12건) | verified |
| server/main.py:97 | RecruitingInquiryCreate 모델 추가 | grep "RecruitingInquiryCreate" OK | verified |
| server/main.py:1660 | POST /api/insuro/recruiting/inquiry | grep "recruiting_inquiry" OK (2건) | verified |
| server/main.py:1680 | GET /api/insuro/recruiting/funnel | grep "recruiting/funnel" OK | verified |
| src/lib/behaviorTracker.ts | 행동 추적 유틸리티 (신규) | grep "TRIGGER_CONDITIONS" OK (5건) | verified |
| src/hooks/useBehaviorCta.ts | 행동 CTA 훅 (신규) | grep "useBehaviorCta" OK | verified |
| src/lib/recruitingFunnel.ts | 전환 퍼널 로거 (신규) | grep "logFunnelEvent" OK | verified |
| src/components/LockedFeatureOverlay.tsx:9,55,81,106 | 행동CTA+퍼널이벤트 통합 | grep "behaviorCtaTriggered" OK (2건) | verified |

---

## 발견 이슈 및 해결

### 자체 해결 (1건)
1. **useBehaviorCta.ts에서 TRIGGER_CONDITIONS 미사용 import** — import 목록에서 제거
   - 상세: src/hooks/useBehaviorCta.ts:8 — TypeScript 6133 경고 해소

### 범위 외 미해결 (0건)

---

## L1 스모크테스트 결과

- 서버 재시작: 성공 (FastAPI uvicorn 포트 8001)
- API 응답 확인:
  - `GET /api/status` → 200 OK
  - `POST /api/insuro/recruiting/inquiry` (인증 없음) → 401 "Missing or invalid authorization"
  - `GET /api/insuro/recruiting/funnel` (인증 없음) → 401 "Missing or invalid authorization"
- 스크린샷: 해당없음 (백엔드+프론트 통합, UI 변경은 LockedFeatureOverlay 뱃지 추가)
- TypeScript tsc --noEmit: 에러 0건

---

## 완료 시그니처 검증

- [x] `recruiting_inquiry` @ `supabase/migrations/` — 12건 매치
- [x] `TRIGGER_CONDITIONS` @ `src/` — 5건 매치
- [x] `behavior.*cta` @ `src/` — 다수 매치

---

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-2009-dev3
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2009-dev3
- **머지 의견**: tsc 에러 0건, FastAPI 정상 기동, 새 엔드포인트 2개 등록 확인. RLS + JWT + rate limit 적용으로 보안 충분. 충돌 가능성 낮음 (신규 파일 위주, 기존 파일은 LockedFeatureOverlay만 수정).

---

## QC 검증 결과

- **Overall**: WARN (Gate PASS)
- **PASS (7)**: file_check, data_integrity, full_suite_check (2397 passed), critical_gap, spec_compliance, duplicate_check, signature_check
- **WARN (3)**: tdd_check (구현 먼저 → 테스트 나중 순서), scope_check (worktree 파일 탐지), claude_md_check (design팀 CLAUDE.md 초과 — 본 작업 무관)
- **FAIL (0)**
- **TRUST 5차원**: T R U S T — 전체 passed
- **소요시간**: 18분 41초

---

## 모델 사용 기록

- 루(백엔드) / 작업: migration + API 엔드포인트 / 모델: sonnet / 정당성: -
- 브리짓(프론트) / 작업: behaviorTracker + useBehaviorCta + recruitingFunnel + LockedFeatureOverlay 통합 / 모델: sonnet / 정당성: -
- 모리건(테스터) / 작업: behaviorTracker vitest + recruiting API pytest / 모델: sonnet / 정당성: -

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

