# [Lv.3][test-only] G-3 게이트 ①: 확장↔서버 크로스레이어 계약 테스트 (골든 fixture)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/__tests__/**"
    - "server/tests/**"
    - "tests/contract/**"
    - "extension/background/ingest.js"
  forbidden_paths:
    - "src/**"
    - ".github/**"
    - "server/routes/**"
    - "server/migrations/**"
    - "extension/background.js"
    - "extension/content.js"
  commands:
    - "npx vitest"
    - "pytest"
    - "python"
    - "git"
  merge_policy: "none"
  ttl_hours: 10
```
> ★ merge_policy=none — PR OPEN 유지. base=현 origin/main. 신규 브랜치. **소스 로직 변경 0 — 테스트 + 골든 fixture 만.** (ingest.js 는 export 목적 최소 변경만 허용, 로직 불변.)

## 배경 (Agent 미팅 합의 — 헤임달 최우선 갭)
InsuRo 복합설계+CRM 연동 코드 전부 main 머지 완료. 파일럿 전 G-3 게이트 필요. **최대 갭**: 확장이 실제 조립하는 **요청 bytes ↔ 서버 파서(`parse_and_validate_body`)** 정합을 검증하는 실행 테스트가 **어느 계층에도 없음**. 확장 suite·서버 suite 가 각자 "계약 이해"로 그린일 뿐 — 확장이 필드명 바꾸거나 서버가 `FORBIDDEN_CLIENT_FIELDS` 조이면 **양쪽 그린 유지되고 프로덕션만 깨진다.** 이 계약 테스트가 CI 에서 드리프트를 잡는 유일한 수단. **"이게 없으면 파일럿 금지."**

## 작업 (골든 fixture 기반 양방향 계약 테스트)
1. **골든 fixture 생성**: 확장 `extension/background/ingest.js` 의 `assembleRequestBody(...)`(그리고 CRM 생성 bytes 빌더가 별도면 그것도)가 대표 입력(정상 model A snapshot+analysis_matrix+consent+reference)에 대해 뱉는 **실제 요청 bytes(JSON)** 를 **`tests/contract/ohmy_ppd_v1.golden.json`** 로 고정(byte-exact). 생성 방식은 실제 함수 호출 산출물이어야 함(수기 작성 금지).
   - `assembleRequestBody` 가 export 안 돼 있으면 **export 만 추가**(로직 불변). background.js/content.js 는 건드리지 마라(ingest.js 내부 export 만).
2. **확장측 계약 테스트**(`extension/__tests__/contract-golden.test.ts`): `assembleRequestBody(대표입력)` == 골든 fixture bytes 를 assert. 확장이 드리프트하면 실패.
3. **서버측 계약 테스트**(`server/tests/test_contract_golden.py`): 같은 골든 fixture bytes 를 서버 `parse_and_validate_body`(또는 ingest 스키마 파서)에 그대로 투입 → **파싱 성공** + `FORBIDDEN_CLIENT_FIELDS`(fa_account_id 등) 충돌 0 + 필수필드(contract_version·reference·query_condition·selected_coverages·per_insurer·validation·consent) 전부 인식 assert. 서버가 스키마 조이면 실패.
4. **드리프트 감지 non-vacuous 증명**: fixture 의 한 필드명을 의도적으로 바꾼 mutant 는 양쪽 중 하나가 반드시 실패함을 주석/보조 테스트로 확인.

## 제약
- 계약 테스트 + 골든 fixture 만. **서버 라우트·마이그레이션·확장 로직 변경 금지.**
- 골든 fixture 는 **PII 0**(합성 대표값·마스킹). 실 고객 데이터 금지.
- `parse_and_validate_body` 위치/시그니처는 `server/routes/consultation_history_v1.py` 또는 `server/schemas/consultation_history_v1.py` 실측 후 사용(read-only 참조).

## 검증
- 확장 계약 테스트 PASS(`npx vitest run extension/__tests__/contract-golden.test.ts`) + 확장 전체 회귀 0.
- 서버 계약 테스트 PASS(`pytest server/tests/test_contract_golden.py`) + 서버 consultation history 테스트 회귀 0.
- mutant(필드명 변조) 시 최소 한쪽 실패 실증.

## 완료 (★ 순서 B 종결 규약)
- 변경 = 위 allowed_resources 내부만 (`git diff --stat`).
- **dev6 금지** — dev1.
- ★★ **종결 순서 B**: 커밋 → **push** → `finish-task.sh` **foreground 1회** → `.done` 즉시 세션종료. **finish-task 를 background 로 돌려 terminal-marker/ANU-callback 완료를 기다리지 마라(좀비 원인).** push+.done 이면 끝 — ANU 가 원격서 독립검증·머지.

## goal_assertions (auto-generated)
- `npx vitest run extension/__tests__/contract-golden.test.ts`
- `pytest server/tests/test_contract_golden.py`
