# [Lv.4] Integration Phase2 PR-D0 — V 레코드 GET 조회 + 확장 CORS (서버 선행)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "server/routes/consultation_history_v1.py"
    - "server/main.py"
    - "server/tests/**"
  forbidden_paths:
    - "extension/**"
    - "src/**"
    - ".github/**"
    - "server/customer_match.py"
    - "server/utils/legacy_write_guard.py"
    - "server/migrations/**"
    - "supabase/migrations/**"
    - "server/schemas/consultation_history_v1.py"
    - "server/routes/crm_customer_match_v1.py"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "git"
  merge_policy: "tiered"
  ttl_hours: 24
```

## 배경·단일소스
- 설계: `/home/jay/workspace/memory/plans/insuro-composite-design/integration-design-260721.md` (정본=경로V, X 아키텍처=확장중심 저장·웹앱 나중조회).
- 리포 `/home/jay/projects/InsuRo`, base=현 origin/main(452ed14, Phase1 서버 완료).
- **Integration Phase2 PR-D0(서버 선행)**. PR-D(확장)·PR-E(웹앱)의 unblocker. 이 task 는 **서버 GET 조회 + CORS만**.

## 왜 (Codex 실측 갭)
1. V 레코드는 `POST /consultation-history/v1`(ingest)만 있고 **읽을 GET 엔드포인트가 없다** → 웹앱(PR-E)이 나중 조회·재분석 불가.
2. 확장(PR-D)이 insuro 서버(PR-C 후보검색·V ingest)를 호출하려면 서버 CORS 에 **확장 origin 허용**이 필요한데 현재 chrome-extension origin 이 allowlist 에 없다(`server/main.py` CORS).

## 작업
1. **V 레코드 GET 조회 엔드포인트** 신규:
   - 경로 예: `GET /api/insuro/consultation-history/v1` (목록) + 필요시 `/{id}` (단건).
   - **fa_account_id 서버파생 스코프**(`_require_fa_account_id` = verify_jwt→_verify_incar 재사용) — 타 FA 레코드 반환 0.
   - **`consultation_history_v1_ok_only` 뷰 기반**(record_status='OK' AND deleted_at IS NULL) — REQUIRES_REVIEW·삭제분 노출 0.
   - 응답에 **`analysis_matrix` 포함**(웹 재분석용) + query_condition/selected_coverages/per_insurer/validation/consent 메타. **금지필드(JWT원문·consultantid·API원본) 0.**
   - feature-flag/allowlist 게이트: 조회도 ingest 와 동일하게 `_require_feature_enabled` → `_require_pilot_allowlisted` 적용(파일럿 한정). flag OFF 유지.
2. **확장 origin CORS 허용**:
   - `server/main.py` CORS allowlist 에 chrome-extension origin 추가. **정확 origin 매칭**(와일드카드 전체개방 금지). 파일럿 확장 ID 를 env(예: `INSURO_EXTENSION_ORIGIN`)로 주입, 미설정 시 확장 origin 미허용(fail-closed).
   - 기존 웹앱 origin(insuro.biz 등) CORS 회귀 0.

## 제약
- **읽기 전용 추가.** ingest(POST)·스키마·멱등·계약·PR-C·migration **변경 금지**(Phase1 완료분).
- 조회도 **per-FA 소유권·ok-only** 강제(IDOR·REQUIRES_REVIEW 노출 0).
- CORS 는 **정확 origin**만(전체개방·`*` 금지).
- extension/src **손대지 마라**(PR-D/E).

## 검증 (전부 통과)
- 타 FA 레코드 GET 시도 → 반환 0(tenant 경계 테스트).
- REQUIRES_REVIEW·deleted 레코드 → GET 응답에 미노출(ok-only 증명).
- 응답에 analysis_matrix 포함·금지필드 0.
- 비허용 계정(allowlist 밖) GET → 차단(파일럿 게이트).
- CORS: 허용 origin 만 통과, 미설정 시 확장 origin fail-closed. 웹앱 origin 회귀 0.
- 기존 회귀 0(현 main 809 기준 감소 0).

## 완료
- `server/routes|main.py|tests` 외 변경 0 (`git diff --stat`)
- **dev6 사용금지** — dev1 등에서 실행. worktree finish(STRICT+정확base+worktree cwd) → PR → Gemini High 0 → ANU 독립검증. **머지 금지**.
- **ANU callback**(UTF-8 ≤3900 bytes, envelope). 자기완료 scope-guard 막힘 시 result.json+ANU callback escalate.