# Agent 미팅: InsuRo 확장 integration(PR-D) 설계 방향

**날짜**: 2026-07-22
**소집 이유**: PR-D1 지시서가 실제 Track A 코드와 충돌(Codex 반증). 확장 integration의 올바른 방향을 합일까지 논의.
**참여**: 이리스(FE), 헤임달(보안QA), 로키(레드팀·DA), 오딘(아키텍처), **Codex CC(코드근거)**
**모드**: hybrid · **깊이**: thorough(Lv.4) · **사이클**: 2 · **회장 지시**: Codex 포함, 합일까지

---

## Cycle 1 (independent) 요약
- **이리스**: 토큰 3분류(insuroJwt=local·ohmy=무저장·PII bytes=session). 부재-강제 테스트는 캡처레이어 존치+조립은 background 신규모듈로 재범위화. taint=수명최소화+scrubber+sink-spy+URL allowlist. 재시도=명시버튼 bounded 같은-bytes. 분할=수직슬라이스.
- **헤임달**: leak-proof opaque 래퍼 폐기(증명불가). load-bearing 3불변식=①canary-egress-zero ②lifetime-bound ③consent-gate+single egress choke. 진짜 위협=자동 egress sink(APM/console/dataLayer/postMessage 경계), heap잔존 아님. 래퍼는 fail-loud tripwire로 강등.
- **로키(DA)**: 급소 5 — ①수명최소화vs재시도 dedup키 ②session PII 탈취(DevTools·계정전환레이스) ③**동의-전 검색 PII 전송(최대급소)** ④JWT taint 미포함 ⑤투명re-fetch vs consent바인딩 충돌. 비관습대안=content-addressed 멱등키.
- **오딘**: A7=재범위화("V-ingest 밖 write 재도입→실패", sender와 같은 PR). 확장은 얇게·진실은 서버. 불변식 4→3직교보증+1횡단.
- **Codex CC**: 코드근거로 통짜 수직슬라이스 지지, JWT local 유지 확인, session storage 코드 부재.

## Cycle 2 (Codex 수렴검증 DA) — 교정 4개 후 합일
Codex가 종합안의 4개를 코드근거로 교정 → 반영 → **CONSENSUS YES**.

---

## 최종 합의 (PR-D 설계 — CONSENSUS YES, Codex 6/6 CONFIRM)

1. **검색**: `GET ...?q=` → **POST-body 근접매칭**(URL 쿼리 PII 금지) + **서버 access-log redaction 미들웨어 실구현** + G-3 "검색로그 PII=0" 테스트. 검증 JWT(sub/agent_id) tenant 스코프(FA 자기 장부).
2. **저장소**: PII bytes + idempotency_key = **`chrome.storage.session`**, **terminal durable ack(2xx) 또는 owner-change/만료 시 폐기**(첫 응답 즉시폐기 아님 — 재시도 계약 §2-3-b/c). JWT=storage.local 유지, ohmy 토큰=무저장.
3. **dedup/재시도**: **상태조회 엔드포인트 신설 안 함.** 재시도=같은 key+frozen bytes로 **동일 POST 재전송** → 서버가 원결과 반환(기존 `consultation_history_v1.py:286-315`, 같은key+다른bytes=409). content-hash 미채택(matrix 비결정성).
4. **클라 보유**: frozen bytes+idempotency_key를 ack까지 보존(result_id-only 아님). **JWT를 sink-spy canary 스코프 포함**, JWT를 body/bytes/session에 **안 넣음**. 서버 replay=멱등 POST replay.
5. **만료/INVALIDATED**: operation 종료 → 폐기. 재저장=**FA 명시적 재-preview·재-동의(새 operation·새 스냅샷·새 key)**. **투명 re-fetch·diff 폐기**(baseline 불필요, 조용한 요율스왑 원천불가).
6. **taint-guard 재정의(설계 §3 개정)**: "leak-proof opaque 래퍼=유일 불변식" **폐기**. load-bearing = **[lifetime-min + allowlist-scrubber + sink-spy canary + single egress choke point + URL allowlist]**. opaque 래퍼 → **fail-loud tripwire**로 강등. canary sink-spy = console/fetch(비허용호스트)/모든 storage(session제외)/URL/error·telemetry/runtime.sendMessage·**postMessage(main-world 경계)**/dataLayer/structuredClone + **JWT** = 0.
7. **A7 재범위화**: 뮤테이션 "V-ingest 밖 write 재도입→실패"(D2, sender와 같은 PR). "레거시 자동전송 부재" 유지.
8. **분할**: **D1 = 기존 Track A preview 위 integration 레이어**(명시적 동의 제스처+assemble+V ingest+보안불변식+byte-freeze, **flag OFF**, 수직슬라이스). **D2 = near-match UI·계정전환 잠금·재시도UX·A7 뮤테이션 재범위화.** preview 재번들 금지. 확장 공유파일(content.js/background.js)이라 **serial_only**.

## 미해결/후속
- 로키 급소③(검색 동의): fa_account_id 스코프=자기장부 조회로 3자 disclosure 아님 + access-log redaction으로 완화. 규제 hard-line 재검토는 회장/법무.
- 확장은 dumb carrier(freeze만), 매칭·dedup·canonical 진실은 서버(오딘 원칙).

## 다음
설계 §3(taint-guard) 개정 + 이 합의를 integration-design 문서에 반영 → **PR-D1 지시서 재작성**(위 8항)·merge_policy:none·dev1 발주.
