# [fix] PR-D1 item6 — INVALIDATED/owner-change 시 pending ingest blob 폐기 (재동의 강제)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/**"
  forbidden_paths:
    - "src/**"
    - "server/**"
    - ".github/**"
    - "docs/**"
  commands:
    - "npx vitest"
    - "git"
  merge_policy: "none"
  ttl_hours: 12
```
> ★ merge_policy=none. 브랜치 **`task/task-2831-dev1`**(PR #119)에 이어서 커밋(새 PR 금지).

## 문제 (Codex 검토 — 보안 갭)
합의 item 6 = "만료/INVALIDATED → PII bytes 폐기 + 재-동의". 그런데 현재 `content.js invalidatePreviewState()`(~888-899)는 **content쪽 preview 스냅샷/UI만** 지우고 **background 의 `insuroPendingIngestV1`(storage.session PII blob)을 안 지운다.**
- 시나리오: 저장 실패 → pending blob 잔존 → 페이지 INVALIDATED(stale URL·DOM·계정전환) → 동의 UI 사라짐 → **하지만 background 의 PII bytes 는 남아, 이후 재시도가 재-동의 없이 전송 가능.** → item 6 위반(PII 잔존 + 무동의 재시도).

## 작업
1. **INVALIDATED 시 background pending blob 폐기 배선**: `invalidatePreviewState()`(또는 그 트리거)가 background 에 **clear 메시지**(예: `INSURO_INVALIDATE_PENDING_V1`)를 보내 `insuroPendingIngestV1`(storage.session) 삭제. content INVALIDATED = background pending 폐기 원자적으로.
2. **owner-change(JWT 회전) 시**에도 동일 — 이미 owner-change 폐기 로직이 있으면(background.js ~239-242) INVALIDATED 도 같은 폐기 함수 재사용.
3. **폐기 후 재저장 = 명시적 재-preview·재-동의**(새 스냅샷·새 idempotency_key). 잔존 blob 재시도 경로 차단.
4. **전송차단 후 삭제 순서**: 계정전환/INVALIDATED 시 진행 중 전송 있으면 차단 먼저, 그 다음 삭제.

## 검증 (전부 통과)
- INVALIDATED(stale URL/DOM/계정전환) 발생 시 → `insuroPendingIngestV1` storage.session **부재**(폐기 확인).
- 폐기 후 재시도 시도 → **전송 0**(blob 없음, fail-closed) + 재-동의 요구.
- 기존 PR-D1 테스트(canary·byte·consent·flag-OFF·66건) 회귀 0, 확장 전체(273) 회귀 0.
- 신규 테스트: "INVALIDATED → pending blob 폐기 → 무동의 재시도 0" 증명.

## (부수·선택) item 8 확인
차단된 레거시 메시지(OHMY_CAPTURED 등)가 `storage.local` 에 쓰는 로그에 **PII 없음** 확인(있으면 스크럽). 없으면 보고서에 "로컬 로그=PII 0, 서버전송 아님" 1줄. (레거시 로그 경로 대규모 리팩터는 범위 밖.)

## 완료
- extension/ 외 변경 0. JWT storage 이동 금지(local 유지).
- **dev6 금지** — dev1(브랜치 소유). worktree finish → push(PR #119 반영·새 PR 금지) → ANU 독립검증. **머지 금지**.
- **ANU callback**(UTF-8 ≤3900 bytes, envelope).