# [Lv.4] 확장 — 저장=조회가능(API_MISSING 완화) + 보험사 체크해제 완전제외(견고화)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/content.js"
    - "extension/__tests__/**"
  forbidden_paths:
    - "src/**"
    - "server/**"
    - ".github/**"
    - "extension/manifest.json"
    - "extension/background/**"
  commands: ["npx vitest","git"]
  merge_policy: "none"
  ttl_hours: 12
```
> ★ merge_policy=none. base=현 origin/main. consent/egress/single-egress/taint-guard·저장 전송 로직 불변 — **검증 분류·보험사 선택 필터만.**

## 배경 (회장 파일럿 피드백 2건 + Codex 조율)
1. **저장했는데 인슈로에서 안 보임**: 저장은 됨(id 3, 서버 200·DB). 근데 검증이 `API_MISSING`(선택 담보 일부가 ProductPremiums API 응답에 없음)으로 `record_status=REQUIRES_REVIEW` → ok-only 뷰가 숨김. 근데 per_insurer 합계는 전부 WITHIN_TOLERANCE(과도 격리). 회장 요구="저장했으면 조회돼야 한다."
2. **체크 해제한 보험사가 안 빠짐**: 롯데 체크해제했는데 저장 매트릭스에 10사 전부. `readSelectedInsurerCodes`가 실 DOM에서 체크박스 못 찾아 null 반환 → 필터 미적용 유력.

## 작업 A — P1: API_MISSING 완화 (저장=조회가능)
- `classifyOverallStatus`(content.js ~1821-1827): 현재 `failureCounts`가 0 아니면 무조건 REQUIRES_REVIEW. **API_MISSING(및 API_DUPLICATE 등 담보-디테일 갭)만 있을 땐 warning 으로 강등 → overall_status="OK"**. 단 **`OUT_OF_TOLERANCE`(실제 금액 불일치, ~1800-1804)는 여전히 REQUIRES_REVIEW**(fail-closed 유지).
- `failure_codes`는 그대로 채워 **disclosure 유지**(snapshot assembly ~1857-1894) — 즉 "OK지만 일부 담보 API 미매칭" 정보는 남긴다. 숨기지 말고 기록.
- 결과: 합계 정상 캡처 = OK 저장 → 웹앱 노출. 실제 금액 틀린 것만 격리.
- 근거: Codex 확정 — 웹앱/DB/뷰 3계층이 OK 필터라 확장 완화가 최소·안전.

## 작업 B — P2: 보험사 체크해제 완전 제외 (견고화)
- `readSelectedInsurerCodes`(content.js ~1678-1693, 269-283)가 `#companyInfo input[type="checkbox"][company_code]` 로 선택 보험사를 읽음. **실 ohmymanager DOM에서 이 셀렉터가 0개면 null → 필터 미적용**.
- **견고화(2신호)**: (1) 체크박스 신호(가능하면) + (2) **fallback 2차판정 = 해당 보험사의 캡처 보험료가 전부 0/빈값이면 제외**(체크해제 시 화면 0원 — 회장 관측). 둘 중 하나로 "미선택" 판정되면 **matrix·per_insurer·팝업·premiums 격자 모두에서 제거**.
- 셀렉터가 실 DOM과 안 맞을 가능성 → **체크박스 탐지를 여러 후보로**(예: `[company_code]`, company 컬럼 헤더의 checkbox, `input:checked` 등) 시도하고, 그래도 없으면 **0원 fallback**으로 반드시 제외되게. **null=필터미적용으로 전부 포함하는 현 동작이 근본 버그** → 0원 보험사는 무조건 제외되도록.
- 선택 0개(전부 해제) → "선택된 보험사가 없습니다" sentinel.
- analysis_matrix가 per_insurer서 파생되므로, per_insurer 필터가 제대로면 matrix도 정합.

## 검증
- `npx vitest run extension/__tests__/` 전체 PASS(회귀 0). 신규:
  - P1: API_MISSING만 → overall_status OK(failure_codes에 API_MISSING 기록) / OUT_OF_TOLERANCE → REQUIRES_REVIEW 유지 / 정상 → OK.
  - P2: 체크해제(또는 전担보 0원) 보험사 → matrix·per_insurer·premiums서 제외 / 체크박스 부재시 0원 fallback 작동 / 선택 다수 정상 포함 회귀 0 / 선택0개 sentinel.
- consent·egress·taint·저장 전송·휴대폰포맷 회귀 0.

## 완료 (★ 순서 B)
- content.js(+테스트) 외 변경 0.
- **dev6 금지** — dev2. 커밋 → push → finish-task **foreground 1회** → .done 즉시 종료. **background+wait 금지.** ANU 검증·Codex 검토·머지·새 파일럿빌드 전송은 ANU.

## goal_assertions (auto-generated)
- `npx vitest run extension/__tests__/`
