# [Lv.4] 확장 UI 배치 — floating 패널 + 휴대폰 3-4-4 자동포맷 + consent.scope 정정

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/content.js"
    - "extension/background/ingest.js"
    - "extension/__tests__/**"
    - "tests/contract/**"
  forbidden_paths:
    - "src/**"
    - "server/**"
    - ".github/**"
    - "extension/manifest.json"
    - "extension/background/crm.js"
  commands: ["npx vitest","git"]
  merge_policy: "none"
  ttl_hours: 20
```
> ★ merge_policy=none. base=현 origin/main. 신규 브랜치. host/key/flag(manifest·crm.js)·서버 불변.

## 배경 (회장 파일럿 피드백 + Codex 조율)
파일럿 왕복 성공했으나 확장 캡처 UI 3개 개선 필요.

## 작업
### A. Floating 패널 (회장: "예전처럼 명확한 버튼 + 예쁘게, floating으로")
현재 캡처 UI(보험료 미리보기 → 조회결과 → 고객확인/생성 → 저장)가 **ohmymanager 페이지 맨 아래 앵커(#premium_lists) 뒤에 flow-layout raw 텍스트로 삽입** → 안 보이고 못생김.
- **우측 하단 고정 floating 카드**(position:fixed, 높은 z-index, 스타일된 카드=둥근모서리·그림자·InsuRo 브랜딩)로 재구성. 스크롤·DOM변경 무관하게 **항상 보임**.
- Codex 주의: `attachOhmyPpdPreviewButton`·consent/CRM attach·잠금-무효화 렌더가 **flow-layout 앵커 뒤 삽입 가정** → floating 카드로 **삽입지점 재구성** 필요(단순 1함수 아님). 접이/최소화 가능하면 좋음.
- ★ **캡처/egress/consent/single-egress 로직은 절대 안 건드림** — 렌더/삽입 위치·스타일만. taint-guard·allowlist·계약 bytes 불변.

### B. 휴대폰 3-4-4 자동포맷 (회장 지시)
신규 고객 생성 폼 휴대폰 입력:
- **숫자만 입력** 허용, 입력 즉시 **`010-1111-2222`(3-4-4)로 자동 포맷 표시**.
- 검증: `010-XXXX-XXXX`(11자리) 형식만 통과, 아니면 저장 막고 안내.
- 서버(`crm/customers`)는 형식 검증 없이 verbatim 저장하므로 **확장이 일관 포맷(010-1111-2222)으로 정규화해 전송**.

### C. consent.scope 정정 (근본수정 — 임시로 DB CHECK drop됨)
현재 확장이 `consent.scope="consultation_history_ingest"` 전송 → DB/계약은 **`"CONSULTATION_HISTORY_SAVE"`** 요구(013 CHECK, 서버 operation_scope도 동일). 정정:
- content.js consent 객체 빌더의 scope 상수 → **`"CONSULTATION_HISTORY_SAVE"`**.
- Codex 지적: `extension/background/ingest.js::extractConsentPayload` 의 `CONSENT_SCOPE` fallback 상수도 동일 정정.
- **골든/계약 테스트**(`contract-golden.test.ts`·`prd1-*`)가 `consultation_history_ingest`로 lock돼 있음 → 테스트 fixture도 `CONSULTATION_HISTORY_SAVE`로 **coordinated 갱신**(서버 테스트는 이미 CONSULTATION_HISTORY_SAVE 기대).

### D. JWT 연결 안내 개선 (자동연결 X — Codex: 위험)
현재 `/composite-design/setup` "연결" 버튼 눌러야 JWT 주입. **자동 push는 금지**(Codex: background가 SET_INSURO_JWT를 owner-change로 보고 pending blob 폐기 → 로드마다 자동push는 identity 덮어쓰기/pending 유실 위험).
- 대신 **JWT 없을 때 캡처 UI가 명확히 안내**: "InsuRo 계정 연결 필요 — insuro.biz/composite-design/setup에서 '연결' 클릭" + (가능하면) 그 페이지 여는 링크/버튼. 자동 push 아님.

## 검증
- `npx vitest run extension/__tests__/` 전체 PASS(회귀 0). 골든 계약테스트: consent.scope=CONSULTATION_HISTORY_SAVE로 갱신 후 서버 파서 파싱 성공 유지. 휴대폰 포맷 단위테스트(3-4-4 정규화·검증). floating 렌더/삽입 테스트. consent/egress/taint 회귀 0.
- 파일럿 빌드 스크립트(`build-pilot-extension.mjs`) 산출 여전히 정상(flag=true).

## 완료 (★ 순서 B)
- 변경 = content.js·ingest.js·테스트·골든fixture 만. manifest/crm.js/서버 불변.
- **dev6 금지** — dev2. 커밋 → push → finish-task **foreground 1회** → .done 즉시 종료. **background+wait 금지.** ANU 검증·머지·새 파일럿빌드 재전송은 ANU가.

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