014 — 사무실 기억 Phase 1b (종이 스캔 업로드) 킥오프
Tier: B (R1 + R2 + R3 완주) · 상태: 수렴 완료 → ADR 0015 발행
안건 배경
사무실 기억 문서 Phase 1b 범위:
- 종이 스캔 수동 업로드 경로 신설 (
sourceType: "scanned") - 박스/대량 업로드 UX (N장 동시 처리)
- OCR 큐 가시성
- ops 페이지 수 관찰 대시보드
Phase 1a (서류 생성 참조 패널) 이 S1 (47M) 에서 완성됨. Phase 1b 는 S2 (710M)
선택 경로 — 사무실 기억 축적을 기존 종결 사건 자동 유입에만 의존하지 않고
적극적 과거 자료 수집으로 확장.
현재 상태 (자율 세션 중 발견)
이미 구현된 것
ScannedLegacyMeta타입 + Zod 스키마 (ScannedLegacyMetaSchema, 14 단위 + 5 property 테스트)createScannedLegacyDocActionServer ActionstorageLegacyScannedPathCloud Storage 경로functions/src/legacy-scanned-trigger.tsOCR 트리거computeLegacySourceDistribution분포 집계 유틸 (6 단위 테스트)
미구현 (Chair 회의 필요 → R1~R3 완료)
- 박스/대량 업로드 UX (N장 drag·drop Modal)
- OCR 큐 가시성 UI (ops 콘솔 카드 · tenant 대시보드 뱃지)
- 처리 중 실패 재시도 플로우 (
ocrStatus: "error"→ 재큐) - OCR 비용 관찰 대시보드 (Pro 무제한 유지, tenant 당 월 페이지 수)
embedding필드 + tenant-isolated RAG (R3 신규 결정)
전제 조건 (재정의, R3)
ADR 0015 에 따라 기존 Go 게이트 과적 철회. S2 착수 선행은 회귀 방지선만:
- cross-tenant 격리 자동 테스트 통과 (PR-1)
- 벡터 경계 계약 테스트 (PR-1)
-
originalTextFirestore 금지 · Signed URL 15분 베이스라인 재확인 (기존 정책)
박스 UX · 법무 자문 · 비식별화 고도화는 S3 레이어 로 이동.
Anti-Goal 체크
- ✅ 민사 외 소송 관리 도구: 영향 없음
- ✅ 법률 조언 AI: 영향 없음 (OCR·RAG 참조만, 조언 생성 없음)
- ✅ 의뢰인 B2C: 포털 미연결 유지
- ✅ 변호사 매칭·광고: 영향 없음
R1 (2026-04-23) — 5인 독립 발산 결과
원본 의견
P1 변호사 (민사·채권 10년차)
- 입장: 스캔은 사무장 업무. 변호사 직접 입력 시 건당 2
3만원 인건비 — 경제성 제로. OCR 자동 + 사무장 배치 확인(2050건 단위) UX 만 생존 경로. - 근거:
- 지방 소규모 사무소 기준 1년 200건 × 5년 = 박스 20
30개, 건당 3080장 - 변호사법 §26 비밀유지의무 위반 리스크 — 잘못된 사건 매칭은 과태료보다 징계·손배 실질 리스크
- 대량 마이그레이션에 드래그&드롭 필수, 모바일 카메라는 "지금 이 서면" 1~2장만
- 지방 소규모 사무소 기준 1년 200건 × 5년 = 박스 20
- 놓치면 안 될 질문:
- 종결 5년 경과 기록 의뢰인 AI 학습 저장 동의 — 법무 자문 선행 필요
- 사건번호 OCR 오류 시 책임소재 (AI 과오 vs 사무장 확인누락) → 감사 로그 필수
P2 사무장 (민사 채권 10년차)
- 입장: 박스 일괄 업로드 1순위. 건당 3분 이상이면 포기. 파일명 자동 매칭 필수하되 맹신 금지. OCR → 사무장 1차 확인 → 변호사 승인 2단계.
- 근거:
- 박스 1개 = 30~80건, 사무소당 수백 박스
- 사건번호 정규식 매칭 히트율 30% 미만 — 스캐너 기본 파일명 "IMG_20240315_001.pdf" 가 8할
- 팩스/오래된 복사본 OCR 신뢰도 60% 이하 — "OCR 실패 시 수기 태깅 후 저장" 경로가 생존선
- 놓치면 안 될 질문:
- 중복 업로드 dedup (해시 기반) — 없으면 legacy 컬렉션 쓰레기로 참
- 업로드 중단·재개 (Wi-Fi 끊김 대응)
P3 PM
- 입장: Phase 1b 단독 착수 반대. Phase 1a 텔레메트리 (hit rate · cancelRate) 14일 실측 선행 필수. S2 는 1a 텔레메트리 실측 + 1b 최소 스캐폴드(큐 가시성·비용 가드) 병행.
- 근거:
- 재활용 루프 (사무실 기억 참조) hit rate < 5% 면 1b 저장량 증대는 ROI 역전
- Anti-Goal 교차: 스캔 자료가 cross-tenant 검색 경로 노출 시 #2(법률 조언)·PII 유출 동시 위반
- 1a S2 캐시·UX 가 hit rate 레버 더 큼 — 1b 단독 시 1a 개선 2주+ 지연
- 놓치면 안 될 질문:
relatedMemoriesEvents7일치 shown/clicked 비율 실측 — 5% 미만이면 1b 저장 동결- rules · guardedQuery tenant 격리 선증명 여부
P4 디자이너
- 입장: 모달 내 실시간 상태 + 사이드바 얇은 배지 하이브리드. 20장 인지 한계. 5필드 한 번에 검수 (단계별 금지).
- 근거:
- 업로드·OCR·검수 한 태스크 → 모달 체류가 인지 경로 가장 짧음 (Dialog + ScrollArea + Progress)
- 4상태 시각화: Badge variant + Skeleton + AlertCircle. 20장 넘으면 Accordion error 펼침
- 모바일 카메라
<input capture="environment">로 반응형 충분, PWA 불필요
- 와이어프레임 힌트:
[모달: 박스 업로드 · 12/20 처리중]✓ 소장_001.pdf [완료 · 검수]⟳ 소장_002.pdf [Progress 60%]⚠ 영수증_003.jpg [재시도] [제외][모두 재시도 (2)] [검수로 →]
- 놓치면 안 될 질문:
- OCR confidence score 필드별 하이라이트 가능 여부 (없으면 전 필드 동등 노출 = 검수 피로)
- 백그라운드 완료 신호 — 토스트 vs 배지 중 하나만
P5 개발자
- 입장: 전처리는 클라이언트 Canvas (sharp Cloud Function 과함). 자동 재시도 반대 (중복 write 위험). p-limit 5 큐 + state machine 필수. 1b 단독, 1a 병행 금지.
- 근거:
- sharp CF 2GB 메모리·cold start — 클라 Canvas 가 사용자 기기로 분산 처리
- GCF 동시성 1000 한도 보호 —
legacy-scanned-trigger.ts에ocrStatus: queued|processing|done|failedstate machine 필수 - 기존 재사용:
storageLegacyScannedClientPath+ScannedLegacyMetaSchema+executeAiAction. 신규 = UX + 큐
- 놓치면 안 될 질문:
onSnapshot100 docs 구독 → Firestore read 폭증. aggregateduploadBatches/{batchId}roll-up 필요- Vertex OCR retryable 분류 (
upstream_5xx만 자동) —refundAssistAction정책과 정렬?
R1 합의 지점
- ✅ OCR 자동 추출 + 확인 게이트 필수 (P1·P2·P4 전원) — 자동 저장 금지
- ✅ 대량 드래그&드롭 업로드 필수 (P1·P2·P4)
- ✅ 모바일 카메라는
<input capture>반응형 (P1·P4) — PWA 불필요 - ✅ 전처리는 클라이언트 Canvas (P5) — 반대 없음
- ✅ tenant 격리 선증명 (P3 강조) — 반대 없음
R1 충돌 지점 (R2 해소 대상)
- S2 범위: 1b 단독 (P5) ↔ 1a+1b 병행 (P3)
- OCR 확인 게이트 단계 수: 1단 (P1·P4) ↔ 2단 (P2)
- OCR 실패 처리: 자동 재시도 반대 (P5) + 사용자 트리거 (P4) + 수기 폴백 (P2)
- onSnapshot 비용: roll-up (P5) vs 모달 실시간 (P4)
- 법무 선행: P1 AI 저장 동의 + P3 cross-tenant 증명
R2 (2026-04-23) — 3회차 크로스 토크
R1 충돌 5건에 대해 5인 상호 반박 → Chair 피드백 2회 반영 → 재수렴.
R2 1차 — 초기 크로스 토크
충돌 1 · S2 범위
- P3: 1a hit rate 측정 없이 1b 저장량 증대는 ROI 역전.
- P5: 1b 스캐폴드는 S2 병행 충분. 대량 박스 UX 는 S3 로 양보.
- P1 중재: 파일럿 사무소 박스 실측 3주 내 확보 가능.
- 부분 화해: S2 = 1a 관측 + 1b 스캐폴드 + 단건~5건 업로드. 박스 UX = S3.
충돌 2 · 확인 게이트 단계
- P2: 비밀유지 책임 변호사 귀속 → 2단 필수.
- P1: 전건 2단은 업무 마비. 리스크 기반 차등 (confidence + 사건번호 교차 매칭).
- P4: 모달 내 "변호사 승인 대기 N건" 필터.
- P5:
ocrStatus에awaiting_paralegal/awaiting_lawyer/approved추가. - 해소: 리스크 기반 차등 + confidence 임계값 ADR 명시.
충돌 3 · OCR 실패 처리
- 3층 구조 합의: 사용자 재시도 (최대 3회) → 벌크 재시도 → 수기 태깅 폴백.
충돌 4 · onSnapshot 비용
tenants/{tid}/uploadBatches/{batchId}roll-up 문서 1건 구독 + 실패 시 드릴다운.
충돌 5 · 법무·보안 선행
- R2 1차에서 Go 게이트 3항목 설정: 1a 14일 실측 · tenant 격리 자동 테스트 · 법무 서면 회신.
- P7 보안 소환: PII 최소화,
originalText금지, Signed URL 15분, 비식별화 파이프라인.
R2 2차 — Chair 피드백 "출시 우선 · 레이어 적층"
Chair: "서비스를 해야 된다. 핵심은 법률 사무소 문서 DB화 → 해당 사무실 활용 우선. 레이어 쌓아 보안·규제 처리."
- P3 입장 수정: Go 게이트 3항목 과적 인정. cross-tenant 격리 자동 테스트만 선행 필수. 나머지는 레이어.
- P1 입장 수정: tenant 내부 재활용은 수임계약서
업무 수행 보조 + 데이터 보관범위. 법무 자문 서면 회신은 S3 파일럿 확대 시 병행. - P7 완화: 베이스라인 정책을 "신규 Go 게이트"로 재포장한 것 철회. 회귀 테스트에만 박아둔다.
- 신규 게이트 = 0 확정.
R2 3차 — Chair 피드백 "AI 학습 · tenant 완전 격리"
Chair: "AI 학습도 당연. 자기 데이터를 자기 AI 가 학습해서 자기 업무에 활용. tenant 별 완전 격리."
"학습" 의 기술적 정의:
| 후보 | 실현성 | 판정 |
|---|---|---|
| A. Fine-tuning (tenant 전용 LLM) | 비현실적 (비용·관리) | ❌ 배제 |
| B. Tenant-isolated 임베딩 + RAG | Firebase Vector Search + Gemini embedding | ✅ 채택 |
| C. 메타 매칭 (Phase 1a 현재) | hit rate 레버 약함 | 유지 → B 로 점진 대체 |
- P5:
legacyDocs.embedding필드 +findNearest기반 벡터 검색. 쿼리 경로가tenants/{tid}/legacyDocs로 path-scoped → 아키텍처상 cross-tenant 불가능. - P3: 본질적 차별점. "우리 사무소 전용 AI" 포지셔닝.
- P1: "내 사무소 과거 판례 · 서면 스타일 유지 + reminder" = 변호사 실질 가치.
- P2: 업무 즉시 단축 효과 (건당 3~5분 수작업 → 0초).
- P4: S2 에서 UX 변화 최소화, S3 에서 의미 기반 유사도 도입.
- P7: 벡터 인덱스 tenant 경계 E2E 테스트로 회귀 방지.
R2 최종 양보 불가 선
| 역할 | 선 | 성격 |
|---|---|---|
| P5 | 자동 재시도 금지 · 벡터 쿼리 collection path scoped | 기술 원칙 |
| P3 | cross-tenant 격리 + 벡터 경계 자동 테스트 | 회귀 방지 |
| 베이스라인 | originalText Firestore 금지 · Signed URL 15분 · 임베딩 tenant path 외 저장 금지 | 기존 정책 |
R2 충돌 해소 현황
| # | 쟁점 | 상태 |
|---|---|---|
| 1 | S2 범위 | 해소 — 단건 업로드 + 스캐폴드 + 임베딩 |
| 2 | 확인 게이트 | 해소 — 리스크 차등 (R3 수치) |
| 3 | OCR 실패 | 해소 — 3층 |
| 4 | onSnapshot | 해소 — roll-up |
| 5 | 법무·보안 선행 | 해소 — 회귀 테스트만 선행 |
| 6 (신규) | "AI 학습" 정의 | 해소 — tenant-isolated 임베딩 + RAG |
R3 (2026-04-23) — 최종 결정문
결정
Phase 1b 를 S2 (7~10M) 에 착수한다. 3대 원칙:
- Tenant 격리 AI 학습: 각 사무소 데이터로 그 사무소 AI 가 학습·활용. cross-tenant 유통 금지.
- 출시 우선: 기능 Go 게이트는 "지금 없으면 법적으로 출시 불가"만 통과. 나머지 레이어화.
- 레이어 적층: S2 → S3 → S4 순차 강화. 보안·규제·비식별화는 출시 후 레이어.
S2 범위 (지금 착수 · 46주 · PR-18)
| # | 항목 | 비고 |
|---|---|---|
| 1 | cross-tenant + 벡터 경계 자동 테스트 | 방어선 선행 |
| 2 | ocrStatus state machine 확장 | queued | processing | awaiting_paralegal | awaiting_lawyer | approved | failed |
| 3 | uploadBatches/{batchId} roll-up 문서 | { total, done, failed, awaitingReview, lastUpdated } |
| 4 | 감사 로그 legacyAuditLogs/* | 업로드자·승인자·confidence·retryCount |
| 5 | 임베딩 자동 생성 파이프라인 | Gemini text-embedding-004 → legacyDocs.embedding (768-dim) |
| 6 | 리스크 차등 승인 | confidence ≥ 80% + 사건번호 정규식/파일명/바디 교차 → 사무장 단독 |
| 7 | 단건~5건 업로드 UX | Dialog + Progress |
| 8 | 1a 관측 대시보드 | 참고용, 차단 게이트 아님 |
S3 범위 (S2 출시 후)
findRelatedMemoriesForDocGenAction임베딩 기반 2세대 (findNearest)- 박스 대량 업로드 UX (파일럿 실측 후)
- 비식별화 파이프라인 강화 (
searchable필드 분리) - 수임계약서 템플릿 + 법무 자문 서면 회신
- Signed URL · 다운로드 텔레메트리
S4 범위 (이후)
- 사무실 전역 의미 검색 ("이런 사건 과거에 있었나?")
- 요약·트렌드 집계 (tenant 내부)
- 임베딩 역공학 리스크 법적 문서화
- 신뢰도 배지 · confidence 표시
Minority Report
- P3 초기 입장: "1a 텔레메트리 14일 실측 선행 필수, 1b 단독 착수 반대"
- 처리: R2 2차 Chair 피드백 "출시 우선" 에 따라 Go 게이트 완화. 1a 관측은 병행 대시보드 (S2 항목 8) 로 유지하되 차단 조건 아님.
- P7 초기 입장: "비식별화 파이프라인 선행 · 법무 서면 회신 선행"
- 처리: R2 2차 Chair 피드백에 따라 S3 레이어로 이동. S2 에는 회귀 테스트만.
- P2 초기 입장: "전건 2단 승인 (사무장 + 변호사) 필수"
- 처리: R2 1차에서 리스크 기반 차등으로 수정 수용. confidence 임계값 미만·매칭 실패 건은 변호사 승인 유지.
- P5 초기 입장: "1b 단독 착수, 1a 병행 금지"
- 처리: R2 에서 S2 에 1a 관측 대시보드 포함으로 부분 양보.
성공 지표
- S2 종료 시점:
- 단건 업로드 경로로 파일럿 사무소 1곳 실제 업로드 ≥ 50건
- OCR 성공률 ≥ 85% (팩스·오래된 복사본 제외 85% 이상)
- cross-tenant 격리 자동 테스트 100% pass · 프로덕션 격리 위반 0건
- 임베딩 생성 파이프라인 tenant 당 월 비용 < 10원
- S3 진입 트리거:
findRelatedMemoriesForDocGenActionshown → clicked 비율 기초치 확보 (1a 2세대 판정 근거)
후속 과제
- ADR 0015:
decisions/0015-tenant-isolated-ai-learning-and-phase1b.md발행 (본 결정 공식 기록) - PR 분해: S2 8항목 PR-1~8 순차 머지
- 파일럿 유치: P1 변호사가 지방 사무소 1곳 박스 실측 (3주 내)
- ADR 0015 정합:
CLAUDE.md"AI 파이프라인" 섹션에 tenant-isolated RAG 원칙 추가 검토 (S2 중)
품질 체크리스트
- Anti-Goal 4개 위반 없음
- Minority Report 4건 ADR 에 명시
- 측정 가능한 성공 지표 (업로드 수 · OCR 성공률 · 격리 테스트 pass)
- 기존 코드·데이터 모델 (
legacyDocs·guardedQuery) 와 모순 없음 - P1 변호사 + P5 개발자 양측 납득 (양보 불가 선 준수)