본문으로 건너뛰기

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 테스트)
  • createScannedLegacyDocAction Server Action
  • storageLegacyScannedPath Cloud Storage 경로
  • functions/src/legacy-scanned-trigger.ts OCR 트리거
  • 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)
  • originalText Firestore 금지 · Signed URL 15분 베이스라인 재확인 (기존 정책)

박스 UX · 법무 자문 · 비식별화 고도화는 S3 레이어 로 이동.

Anti-Goal 체크

  • ✅ 민사 외 소송 관리 도구: 영향 없음
  • ✅ 법률 조언 AI: 영향 없음 (OCR·RAG 참조만, 조언 생성 없음)
  • ✅ 의뢰인 B2C: 포털 미연결 유지
  • ✅ 변호사 매칭·광고: 영향 없음

R1 (2026-04-23) — 5인 독립 발산 결과

원본 의견

P1 변호사 (민사·채권 10년차)

  • 입장: 스캔은 사무장 업무. 변호사 직접 입력 시 건당 23만원 인건비 — 경제성 제로. OCR 자동 + 사무장 배치 확인(2050건 단위) UX 만 생존 경로.
  • 근거:
    1. 지방 소규모 사무소 기준 1년 200건 × 5년 = 박스 2030개, 건당 3080장
    2. 변호사법 §26 비밀유지의무 위반 리스크 — 잘못된 사건 매칭은 과태료보다 징계·손배 실질 리스크
    3. 대량 마이그레이션에 드래그&드롭 필수, 모바일 카메라는 "지금 이 서면" 1~2장만
  • 놓치면 안 될 질문:
    1. 종결 5년 경과 기록 의뢰인 AI 학습 저장 동의 — 법무 자문 선행 필요
    2. 사건번호 OCR 오류 시 책임소재 (AI 과오 vs 사무장 확인누락) → 감사 로그 필수

P2 사무장 (민사 채권 10년차)

  • 입장: 박스 일괄 업로드 1순위. 건당 3분 이상이면 포기. 파일명 자동 매칭 필수하되 맹신 금지. OCR → 사무장 1차 확인 → 변호사 승인 2단계.
  • 근거:
    1. 박스 1개 = 30~80건, 사무소당 수백 박스
    2. 사건번호 정규식 매칭 히트율 30% 미만 — 스캐너 기본 파일명 "IMG_20240315_001.pdf" 가 8할
    3. 팩스/오래된 복사본 OCR 신뢰도 60% 이하 — "OCR 실패 시 수기 태깅 후 저장" 경로가 생존선
  • 놓치면 안 될 질문:
    1. 중복 업로드 dedup (해시 기반) — 없으면 legacy 컬렉션 쓰레기로 참
    2. 업로드 중단·재개 (Wi-Fi 끊김 대응)

P3 PM

  • 입장: Phase 1b 단독 착수 반대. Phase 1a 텔레메트리 (hit rate · cancelRate) 14일 실측 선행 필수. S2 는 1a 텔레메트리 실측 + 1b 최소 스캐폴드(큐 가시성·비용 가드) 병행.
  • 근거:
    1. 재활용 루프 (사무실 기억 참조) hit rate < 5% 면 1b 저장량 증대는 ROI 역전
    2. Anti-Goal 교차: 스캔 자료가 cross-tenant 검색 경로 노출 시 #2(법률 조언)·PII 유출 동시 위반
    3. 1a S2 캐시·UX 가 hit rate 레버 더 큼 — 1b 단독 시 1a 개선 2주+ 지연
  • 놓치면 안 될 질문:
    1. relatedMemoriesEvents 7일치 shown/clicked 비율 실측 — 5% 미만이면 1b 저장 동결
    2. rules · guardedQuery tenant 격리 선증명 여부

P4 디자이너

  • 입장: 모달 내 실시간 상태 + 사이드바 얇은 배지 하이브리드. 20장 인지 한계. 5필드 한 번에 검수 (단계별 금지).
  • 근거:
    1. 업로드·OCR·검수 한 태스크 → 모달 체류가 인지 경로 가장 짧음 (Dialog + ScrollArea + Progress)
    2. 4상태 시각화: Badge variant + Skeleton + AlertCircle. 20장 넘으면 Accordion error 펼침
    3. 모바일 카메라 <input capture="environment"> 로 반응형 충분, PWA 불필요
  • 와이어프레임 힌트:
    [모달: 박스 업로드 · 12/20 처리중]
    ✓ 소장_001.pdf [완료 · 검수]
    ⟳ 소장_002.pdf [Progress 60%]
    ⚠ 영수증_003.jpg [재시도] [제외]
    [모두 재시도 (2)] [검수로 →]
  • 놓치면 안 될 질문:
    1. OCR confidence score 필드별 하이라이트 가능 여부 (없으면 전 필드 동등 노출 = 검수 피로)
    2. 백그라운드 완료 신호 — 토스트 vs 배지 중 하나만

P5 개발자

  • 입장: 전처리는 클라이언트 Canvas (sharp Cloud Function 과함). 자동 재시도 반대 (중복 write 위험). p-limit 5 큐 + state machine 필수. 1b 단독, 1a 병행 금지.
  • 근거:
    1. sharp CF 2GB 메모리·cold start — 클라 Canvas 가 사용자 기기로 분산 처리
    2. GCF 동시성 1000 한도 보호 — legacy-scanned-trigger.tsocrStatus: queued|processing|done|failed state machine 필수
    3. 기존 재사용: storageLegacyScannedClientPath + ScannedLegacyMetaSchema + executeAiAction. 신규 = UX + 큐
  • 놓치면 안 될 질문:
    1. onSnapshot 100 docs 구독 → Firestore read 폭증. aggregated uploadBatches/{batchId} roll-up 필요
    2. Vertex OCR retryable 분류 (upstream_5xx 만 자동) — refundAssistAction 정책과 정렬?

R1 합의 지점

  1. OCR 자동 추출 + 확인 게이트 필수 (P1·P2·P4 전원) — 자동 저장 금지
  2. 대량 드래그&드롭 업로드 필수 (P1·P2·P4)
  3. 모바일 카메라는 <input capture> 반응형 (P1·P4) — PWA 불필요
  4. 전처리는 클라이언트 Canvas (P5) — 반대 없음
  5. tenant 격리 선증명 (P3 강조) — 반대 없음

R1 충돌 지점 (R2 해소 대상)

  1. S2 범위: 1b 단독 (P5) ↔ 1a+1b 병행 (P3)
  2. OCR 확인 게이트 단계 수: 1단 (P1·P4) ↔ 2단 (P2)
  3. OCR 실패 처리: 자동 재시도 반대 (P5) + 사용자 트리거 (P4) + 수기 폴백 (P2)
  4. onSnapshot 비용: roll-up (P5) vs 모달 실시간 (P4)
  5. 법무 선행: 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: ocrStatusawaiting_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 임베딩 + RAGFirebase 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기술 원칙
P3cross-tenant 격리 + 벡터 경계 자동 테스트회귀 방지
베이스라인originalText Firestore 금지 · Signed URL 15분 · 임베딩 tenant path 외 저장 금지기존 정책

R2 충돌 해소 현황

#쟁점상태
1S2 범위해소 — 단건 업로드 + 스캐폴드 + 임베딩
2확인 게이트해소 — 리스크 차등 (R3 수치)
3OCR 실패해소 — 3층
4onSnapshot해소 — roll-up
5법무·보안 선행해소 — 회귀 테스트만 선행
6 (신규)"AI 학습" 정의해소 — tenant-isolated 임베딩 + RAG

R3 (2026-04-23) — 최종 결정문

결정

Phase 1b 를 S2 (7~10M) 에 착수한다. 3대 원칙:

  1. Tenant 격리 AI 학습: 각 사무소 데이터로 그 사무소 AI 가 학습·활용. cross-tenant 유통 금지.
  2. 출시 우선: 기능 Go 게이트는 "지금 없으면 법적으로 출시 불가"만 통과. 나머지 레이어화.
  3. 레이어 적층: S2 → S3 → S4 순차 강화. 보안·규제·비식별화는 출시 후 레이어.

S2 범위 (지금 착수 · 46주 · PR-18)

#항목비고
1cross-tenant + 벡터 경계 자동 테스트방어선 선행
2ocrStatus state machine 확장queued | processing | awaiting_paralegal | awaiting_lawyer | approved | failed
3uploadBatches/{batchId} roll-up 문서{ total, done, failed, awaitingReview, lastUpdated }
4감사 로그 legacyAuditLogs/*업로드자·승인자·confidence·retryCount
5임베딩 자동 생성 파이프라인Gemini text-embedding-004legacyDocs.embedding (768-dim)
6리스크 차등 승인confidence ≥ 80% + 사건번호 정규식/파일명/바디 교차 → 사무장 단독
7단건~5건 업로드 UXDialog + Progress
81a 관측 대시보드참고용, 차단 게이트 아님

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 진입 트리거:
    • findRelatedMemoriesForDocGenAction shown → 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 개발자 양측 납득 (양보 불가 선 준수)