사무실 기억 — 업무 유산(legacy) 의 디지털화
상태: Phase 0~1a 완료 · 자동 회상 V2 의미검색 통일 (ADR 0048, 2026-06-03) 날짜: 2026-04-19 (최종 갱신 2026-06-03) 선행 결정: ADR 0001 — Vision 과 Core Value · ADR 0015 — Tenant 격리 AI 학습 · ADR 0048 — 기억·판례 메뉴 재정의 + 자동 회상 통일 기술 식별자:
/legacy라우트,tenants/{tid}/legacyDocuments/*컬렉션 (의미 재정립 후 유지)
한 줄 정의
사무실 기억 은 이 법률사무소가 직접 작성·처리해 온 서류의 비식별화 기록이며, 새 서류를 작성할 때 자동으로 참조되는 이 사무실 고유의 업무 유산(legacy) 이다.
무엇이 아닌가 — 오해 방지
| 혼동 대상 | 차이 |
|---|---|
| 판례 라이브러리 | 판례는 법원 공개 DB (대법원 종합법률정보·케이스노트 등) 영역. "사무실 기억" 은 이 사무실의 자체 작업물 — 세상 어느 DB 에도 없음 |
| 낡은 파일 아카이브 (legacy code 뉘앙스) | 영어 legacy 의 본의는 "유산(heritage)" — 남긴 것, 축적된 자산. 기술 업계의 "낡은 것" 과 정반대 방향 |
| 의뢰인 포털용 자료 | 사무실 내부 자산. 의뢰인에게 직접 노출되지 않음 |
| 법률 도메인 "유산" (상속 사건) | 같은 한국어를 쓰지만 전혀 다름. UI 라벨에서는 이 혼동을 피하기 위해 "유산" 단독 표기를 쓰지 않고 "기억" 으로 통일 |
무엇인가 — 정체성 선언
- 고유 자산 — 각 사무실이 일해 온 방식의 결과물. 변호사 개인에게 붙어 있던 암묵지(Tacit Knowledge) 를 서류 단위로 디지털화한 것.
- 살아 있는 기억 — 종결된 사건의 시체안치소가 아니라, 새 사건 앞에서 "예전에 비슷한 거 있었지?" 할 때 자동으로 호출되는 능동적 자원.
- 재활용 루프의 절반 — "저장 → 비식별화 → 재활용" 세 단계가 하나의 고리. 재활용(문서 생성 시 참조) 이 없으면 저장의 의미가 죽는다.
- 전 사무소 활성 — ADR 0002(전 사용자 무료) 정합. tier 차별 없이 모든 사무소에서 활성화.
legacyDocLimit은 어뷰징 방어용 운영 상한일 뿐 기능 차별이 아니다.
3층 네이밍 규칙 (SSoT)
세 층이 서로 다른 언어로 같은 하나를 가리킨다. 드리프트 방지를 위해 이 표가 단일 출처(Single Source of Truth) 다.
| 층 | 언어 | 예시 | 원칙 |
|---|---|---|---|
| UI 라벨 | 한국어 인지 은유 | "사무실 기억", "비슷한 과거 기억", "기록 추가" | 인격화·은유. 변호사 인지 과정과 일치. 첫 화면에서 정체성이 드러남 |
| 기술 식별자 | 영문 legacy | /legacy, legacyDocuments, findRelatedMemoriesAction | 본의(유산) 로 재정의됨. 라우트·컬렉션 개명 안 함 (마이그레이션 비용 회피). 파일 상단 주석으로 재정의 명시 |
| 개념·설명 | 한영 혼합 서사 | "이 사무실의 업무 유산(legacy) — 일해 온 방식의 결과물" | 부제·온보딩·빈 상태·마케팅 카피. 두 층을 의미론적으로 연결 |
라벨 매트릭스 (Phase 0 에서 적용)
| 위치 | Before | After |
|---|---|---|
| 사이드바 메뉴 | 문서 아카이브 | 사무실 기억 |
| 모바일 드로어 | 문서 아카이브 | 사무실 기억 |
| 페이지 H1 | 문서 아카이브 | 사무실 기억 |
| 페이지 부제 | (없음) | "이 사무실이 일해 온 방식의 결과물 · 업무 유산(legacy)" |
| 빈 상태 (전체 없음) | 아카이브된 문서가 없습니다 | 아직 기억이 쌓이지 않았습니다 |
| 빈 상태 (필터/검색) | 해당 상태의 문서가 없습니다 / 검색 결과가 없습니다 | (유지) |
| 상세 헤더 뒤로가기 | 아카이브 목록 | 사무실 기억 |
| 유사 문서 패널 | 유사 판례 | 비슷한 과거 기억 |
| 유사 문서 CTA | 판례 찾기 + AI 분석 | 기억에서 찾기 + AI 분석 |
| 유사 문서 안내 | 이 사건과 유사한 아카이브 문서를 찾고... | 이 사건과 비슷한 사무실 기억을 찾아 AI 가 유사점·차이점·활용 포인트를 분석합니다. |
| 활동 로그 | 문서 아카이브 완료 / 오류 | 사무실 기억 추가 / 오류 |
| 업로드 버튼 (Phase 1) | — | 기록 추가 ← 행동 동사는 중립어 |
네이밍 원칙
- 은유는 "보는 자리"(메뉴·타이틀·빈 상태·설명) 에. 변호사가 머물러 읽는 위치.
- 중립 행동어는 "누르는 자리"(버튼·CTA·폼 액션) 에. "기억에 저장" 은 어색 → "기록 추가" / "저장".
- 외래어 단독 노출 금지 (메뉴에 "레거시" 단독 배치는 한글 톤 파괴).
legacy는 부제·설명에서 의미 환기용으로만 등장. - 도메인 충돌 회피: "유산" 은 상속 사건과 혼동 → UI 단독 라벨 금지. 부제에서 "업무 유산(legacy)" 처럼 한정어와 함께만 허용.
데이터 흐름 — 재활용 루프
[종결 사건 자동 유입 (현재)]
cases/{id}.status = "closed"
→ onCaseClosedLegacyPipeline (functions/src/legacy-pipeline.ts)
→ 서류·증거 파일을 legacyDocuments 로 복사
→ OCR → PII 비식별화 → text-embedding-004 임베딩 생성 (V2, ADR 0015/0017)
[종이 스캔 수동 업로드 (Phase 1 신설)]
/legacy 업로드 UI → sourceType: "scanned" 로 적재
→ 기존 processFileForLegacy 파이프라인 재사용
→ 필수 메타: 의뢰인 + 사건유형 + 연도
[재활용 — 새 서류 작성 시 자동 참조]
/docs/generate → getRagContextForDocGenAction
→ findNearest 의미 검색 (Tenant RAG · text-embedding-004) 으로 사무실 기억 중 유사 스니펫 검색
→ Gemini 프롬프트에 주입
→ 생성된 서류에 referencedLegacyDocIds 저장 (Phase 2)
→ UI 에서 "참고한 사무실 기억" 섹션 명시 노출 + 변호사 제외 가능
로드맵
| Phase | 범위 | 상태 | 예상 규모 |
|---|---|---|---|
| 0 | 네이밍·라벨 전면 교체 + 본 정체성 문서 수립 | ✅ 완료 | 12 |
| 1a (서류 생성 참조) | Step 2 우측 RelatedMemoriesPanel 카드 3~5개 · 가벼운 쿼리 (유형+서면+금액bucket) · 3종 텔레메트리 (shown/clicked/cancel) | ✅ S1 scaffold 완료 (2026-04-22) | PR #402~#414 |
| 1b (스캔 업로드) | 종이 스캔 수동 업로드 경로 신설. sourceType: "scanned" 추가. 박스/대량 업로드 UX. OCR 큐 가시성. ops 페이지 수 관찰 대시보드 | 계획 (S2) | 1~2주 |
| 2 | 문서 생성 시 "참고한 사무실 기억" 명시 노출. documents.referencedLegacyDocIds 추가. 변호사 제외권. 아카이브 상세에 역방향 "이 기억을 참고한 서류 N건" | 계획 (S3) | 3~5일 |
| 3 | 사건유형·연도·의뢰인 축 탐색. 무한스크롤 (200 하드캡 해제). 사무실 지식 지도 대시보드 | 보류 — 데이터 쌓인 뒤 재검토 | — |
Phase 1a (2026-04-22 착수) 아키텍처 요약
서류 생성 InlineDocGenerate Step 2 진입 시 우측에 skeleton → 카드 렌더 →
실패/빈 결과 silent hide 패턴 (ADR 0012 R1 B 채택). 구현 계층:
- 쿼리 빌더 —
buildRelatedMemoryQuery({ recoveryType, docType, principal, isCommercial })순수 함수. 사건번호·이름·정확 금액 미전파. 유형 + 서면 + 상사 + 금액 bucket (소액/중액/고액). - Server Action —
findRelatedMemoriesForDocGenAction({ caseId, docType }).features.ai.ragSearch킬 스위치 gate. weight 0 (Vertex AI Search 단독). 최대 5 카드, snippet 150자 상한, 메타 배치 조인. - UI —
RelatedMemoriesPanel.tsx. 상태 머신 idle/loading/ready/hidden. 카드: 사건번호 · 유사도 % · 종결일 · 3줄 스니펫 · "이 기억 반영" CTA. - 텔레메트리 — 3종 discriminated union.
related_memories_shown/_clicked/step2_cancel_before_load. 집계 스크립트scripts/aggregate-related-memories-stats.ts→tenantDoc.stats.relatedMemories. - S3 말 C 캐시 재평가 조건 (3 모두 충족 시):
- Hit rate (clickThroughRate) ≥ 40%
- 월 평균 weight 소비 ≥ 20/tenant
- 이탈률 (cancelRate) ≥ 25%
부속 결정 사항
- OCR 비용 한도: Pro 무제한 유지. tenant 당 월 OCR 페이지 수 ops 관찰 대시보드만 신설 (한도 없음, 이상치 감지용). 초기 박스 업로드 후 점감 패턴 예상.
- "Precedent" 네이밍 전면 제거:
SimilarPrecedentsPanel→RelatedMemoriesPanel,findSimilarPrecedentsAction→findRelatedMemoriesAction등. Phase 0 에서 완료. - 라우트·컬렉션 개명 금지:
/legacy,legacyDocuments는 유지. 파일 상단 주석으로 의미 재정의 못박음. - 의뢰인 포털 연결 없음: 사무실 내부 자산. 의뢰인에게는 노출하지 않는다.
파일 상단 주석 템플릿
functions/src/legacy-pipeline.ts, app/(workspace)/legacy/_actions/*.ts, types/legacy-document.ts 등 legacy 식별자를 쓰는 파일 상단에 삽입:
// "legacy" = 기술용어(낡은 것)가 아니라 영어 본의 "유산(heritage)".
// 이 사무실이 일해 온 방식의 결과물 — UI 에서는 "사무실 기억" 으로 노출.
// 정체성 SSoT: apps/docs/content/product/firm-memory.md