ADR 0047 — 형사 portal Policy B (redacted) / C (opt-in) 평가 baseline
Status: Proposed — Pack 6.10 (Policy A, ADR 0046) 의 production 운영 후 Policy B / C 채택 여부를 결정할 측정 기준 정의.
배경
ADR 0046 Policy A (형사 사건 portal 자체 비노출) 가 Pack 6.10 + 6.13 layer 로 ship 됨:
- 발급 시점:
createPortalToken패키지 함수가 criminal-* 거부 - 사용 시점:
validateTokenAction도착 시점 case doc fetch + criminal-* 거부 - UI:
PortalLinkDialog가 형사 사건 시 disabled Button
Policy A 는 가장 보수적인 default-safe 선택. 그러나 의뢰인 (피의자) 이 자기 사건 진행 상황을 자체 조회 못 하는 trade-off — 변호인 1:1 채널 부담.
ADR 0046 마지막 단락은 "production 운영 6개월 + 사용자 피드백 후 Policy B / C 별도 ADR" 이라고 명시. 본 ADR 은 그 평가의 baseline 정의.
검토 대상 정책 (ADR 0046 요약)
| 정책 | 의뢰인 portal 노출 | PII 위험 | 변호인 부담 | 운영 복잡성 |
|---|---|---|---|---|
| A (현재 ship) | 완전 차단 | 0 | 高 (1:1 채널) | 0 |
| B (redacted) | 단계·죄명만 노출 | 낮음 | 중 | 中 (redact 로직) |
| C (opt-in) | 변호인 case-by-case 토글 | 변호인 책임 | 중 | 中 (UI + audit) |
Baseline 측정 항목
Pack 6 production 6개월 이후 다음 데이터를 수집:
1. 사용량 (사무소 형사 사건 누적)
| 측정 항목 | 목적 | Firestore 경로 |
|---|---|---|
| 형사 사건 총 등록 수 (tenant 별) | Pack 6 도입 효과 측정 | tenants/{tid}/cases where recoveryType in criminal-* |
| portal 토큰 발급 시도 + 거부 카운트 | Policy A 가 실제로 막은 양 | activity log type=portal_token_blocked_criminal (신규 필요) |
| validateToken 도착 거부 카운트 | legacy 토큰 또는 우회 시도 양 | console.warn 로그 → ops 텔레메트리 |
2. 변호인 피드백 (signal 채널)
| 채널 | 측정 |
|---|---|
| ops/feedback FAB submissions | "형사 사건 portal" 키워드 검색 → 요청 수 |
| 변호인 1:1 인터뷰 (분기) | "의뢰인이 형사 사건 진행상황을 직접 묻나요?" 정성 |
| support 문의 로그 | "포털 형사" 관련 문의 빈도 |
3. 보안 incident (Policy A 검증)
| 측정 | 목표 |
|---|---|
| 형사 PII (criminalCoreFacts·정과·구속 사실) 의뢰인 외부 유출 | 0 건 (Policy A 효과) |
| portal 토큰 누출 사고 | 형사 사건 비대상이라 의도하지 않은 노출 0 |
| 법정 비공개 사건 portal 노출 | 0 건 |
결정 트리
6개월 후 평가:
1. 형사 사건 등록 < 100 건/사무소 → Policy A 유지 (활용도 낮음)
2. 변호인 피드백 < 5 건 / 6개월 → Policy A 유지 (수요 적음)
3. 변호인 피드백 ≥ 5 건 + 의뢰인 자체조회 요청 명시
↓
3-A. 피해자 PII 우려 안 거론 → Policy C 권장 (변호인 토글)
3-B. 피해자 PII 우려 거론 → Policy B 권장 (redacted)
4. 보안 incident 발생 → Policy A 강화 (외부 reviewer 추가)
Policy B (redacted) 권장 구현 가이드
채택 시:
- 신규 필드:
caseData.portalRedaction?: { hidden: ("coreFacts"|"aggravated"|"detained")[] }— 변호인이 case-by-case 마스킹 선택 - portal view: criminalPhase + chargeName + (마스킹된) coreFacts 만 표시
- PII regex redact: 피해자 이름·금액 등 추정 정규식 — false positive 위험
- e2e: 형사 portal 진입 시 redact 동작 + 누출 0 검증
Policy C (opt-in) 권장 구현 가이드
채택 시:
- 신규 필드:
caseData.criminalPortalEnabled?: boolean— 변호인이 사건 별 토글 createPortalToken분기: criminal-* + enabled=true → 발급 허용validateTokenAction분기: 동일 검사 — fail-safe close 유지- UI: CriminalInfoSection 에 "의뢰인 포털 활성화" 토글 + 경고 안내
- audit log: 토글 변경 사건 모두 활동 로그 + ops 알림
한 줄 본질 정합
의뢰인이 자기 사건 데이터에 접근하는 권리 vs 형사 PII 의 위험. 데이터 활용 (한 줄 본질) 자체가 침해되지 않으면서 사용자 가치 ↑ path 모색.
Policy A 가 default-safe 이라는 점에서 한 줄 본질의 "사무소가 자기 데이터로 자기 AI 학습" 에는 영향 0. Policy B/C 는 의뢰인 surface 확장이지 학습 자산 surface 확장 아님 — 본질 침해 없는 UX 확장 layer.
후속 작업
- 이 ADR 의 측정 항목을 ops dashboard 의 "Pack 6 portal" 위젯에 자동 수집 (Pack 6.16)
- 6개월 시점에 본 ADR 의 결정 트리로 정책 평가
- 채택 시 Pack 6.20+ 에서 B/C 구현 ADR 신설
참고
- ADR 0045 — Pack 6 형사 사건 도메인 정의
- ADR 0046 — 형사 portal PII 노출 정책 (Policy A 선정)
- Pack 6.10 — Policy A 발급 시점 구현 (PR #2355)
- Pack 6.13 — Policy A 도착 시점 layer (PR #2357)