# InsuRo 복합설계 데이터 계약 — GPT·Codex·ANU 3자 합의 (260718)

**작성**: 아누 2026-07-18 KST. 회장 self-smoke #1 결과 + GPT 리뷰 + Codex CC 2라운드 독립 코드검증(worktree task/task-2787+2-dev5) 교차 → 합의.

## self-smoke #1 이 증명한 것
- **캡처 경로 VERIFIED**: 실 Edge/Chromium에서 진단확장 로드·MAIN inject·`/api/ProductPremiums` GET 200 가로챔·10개 보험사 수신·배너 표시. `REAL_BROWSER_CAPTURE_PATH_VERIFIED`.
- **선택집합 계약 실패(예측대로)**: adapter_sum(메리츠 481,359 등)이 화면총액(343,414)보다 큼 = coverage_count 64~74(전체 담보) 합산. `selected_coverage_count=null`, flag `USER_COVERAGES_NOT_UNIQUE`. user_coverages 2개(GUID plan_id), 요청 plan_id=상품템플릿 → 저장플랜으로 활성식별 불가.

## 회장 지시 (verbatim 취지)
저장플랜(user_coverages)을 현재 선택 기준으로 쓰지 말 것. 화면에 떠있는 실제 사람이 보고 있는 현재 선택 상태를 source of truth로. (사용자는 화면에서 체크/해제·가입금액·필터를 실시간 변경 → 저장플랜 ≠ 현재선택.)

## 확정 계약 = 역할분리 하이브리드 (GPT 교정 반영)
- **DOM = 현재 선택 담보집합 + 담보별 현재 가입금액** (source of truth). 저장플랜은 참고로 강등.
- **API `/api/ProductPremiums` = 보험료 원천** (보험사·회사별 coverage_cd·기준보험료·기준금액·미제공여부·납입기간).
- **화면 표시 보험료/총액 = 검증 oracle** (계산 입력 아님). 파이프라인: API캡처 → 동시점 DOM선택 스냅샷 → DOM 선택 coverage_cd+가입금액을 API detailList에 코드 join → 선택담보만 회사별 합계 → 화면총액 대조(EXACT/WITHIN_TOLERANCE/OUT_OF_TOLERANCE) → 허용오차 내에서만 VALIDATED, 불일치 시 고객분석 차단.
- **금지(회귀방지)**: DOM 보험료 셀을 주 계산원으로 승격(과거 스크래핑 취약성 회귀). 담보명 단독 매칭(암진단비(유사암제외) vs 일반암진단비 혼동). 1 DOM담보→1 API coverage_cd 확정 실패 시 fail-closed(추측 금지).

## Codex 코드검증 3교정 (전부 사실 확인, 계약에 반영)
1. 어댑터 로직은 **inject.js 내부**(buildDiagnosticSummary) — `extension/lib/ohmy_premium_adapter.js` 는 이 worktree에 **없음**(host-matcher.js뿐). 태스크 경로참조 정정.
2. content.js:447-452 는 가입금액을 **`el.getAttribute("guide_coverage_amount")` attribute**로 읽음(사용자 편집 input.value 아님). → 실 가입금액 소스 미확정.
3. content.js:445 는 **`:checked` 필터 없이 전체** data-cd 수집("체크 여부 무관"). → 현재선택 추출 미구현.

## Codex 2라운드 refinement (수용, 스파이크에 반영)
- S4는 drop-in 교체 불가 → buildDiagnosticSummary(inject.js:208-224)가 selectedCdSet를 user_coverages에서 내부 생성 → **optional param 또는 sibling helper**로 DOM경로 산출(기존 필드 유지).
- S5 tolerance 분류는 신규(현재 attachScreenTotalDiff inject.js:361-386 는 raw diff만).
- 추가 관찰: **api_captured_at/dom_snapshotted_at 타임스탬프**(race 증거, ppBuffer.capturedAt inject.js:422 미로깅) · GAP 2종 구분(**join 실패** vs **join됐지만 premium null** inject.js:249-272) · **회사별** 중복 coverage_cd 탐지.
- 미래(이번 아님): sanitizer(inject.js:50-65)에 미제공플래그·납입기간 필드 없음 → 계약이 필요로 하면 후속 allowlist 확장.

## 라이브-DOM 미지수 (self-smoke #2 로만 판정)
- 담보 행에 편집가능 `<input>`(현재 가입금액)이 실제 존재하는가 · `checked` 가 진짜 제출상태를 반영하는가 · DOM `data-cd` == API detailList coverage_cd 코드체계 동일한가.

## 합의 결론
GPT·Codex·ANU **열린 분쟁 0**. 다음 = **전면구현 금지, 진단빌드 한정 읽기전용 "선택 스냅샷 스파이크(task-2787+4)"**: 기존 user_coverages 경로 파괴 없이 DOM 선택을 **병렬 관찰 필드**로만 추가·기록 → 회장 self-smoke #2 로 실데이터 MATCH/GAP/UNKNOWN 증거 확보 → 그 후 구현·fail-closed 전환·scrapeScreenTotals 필터화 별도 승인.
