본문으로 건너뛰기

ADR 0053: 표준 사건명 2층 라벨

배경

CEO 디렉티브 (2026-06-11): "민사 5분야 14종으로 한정하지 않고 실무에 사용되는 전분야를 포섭 가능했으면 한다. 라벨 불일치 문제는 제법 장애가 되는 문제."

ADR 0052 (general-civil) 가 목록 외 민사 사건의 등록 경로를 열었지만, 구조적 한계가 남는다:

  1. general-civil 내부가 비정형. 채무부존재확인·해고무효확인·근저당권말소가 전부 같은 라벨 → 유형별 통계·사무소 기억 매칭·exemplar selection 에서 라벨의 정보 가치가 0 이 된다. CEO 가 지적한 "라벨 불일치" 의 실체.
  2. 유형을 "빌려" 등록하는 오염은 여전히 가능. 전용 유형 14종의 경계 사건 (예: 계약 손배 vs 불법행위 손배) 은 라벨 선택 자체가 모호하다.
  3. 자동화 층의 라벨 공간을 늘리는 것은 답이 아니다. Pack 1개 = 약 10 PR (청구취지·시효·계산·서식·E2E). 전분야 × Pack 수준 자동화는 비현실적이고, 한 줄 본질 ("자기 데이터로 자기 AI") 은 자동화가 아니라 데이터 라벨 정합 을 먼저 요구한다.

핵심 관찰: 실무 전분야를 포섭하는 분류 체계는 이미 존재한다 — 법원 재판사무의 표준 사건명 (대여금·양수금·건물인도·소유권이전등기·채무부존재확인 …). 변호사가 매일 쓰는 어휘라 학습 비용이 0 이고, 사건번호·소장에서 AI 가 자동 추출할 수 있다.

결정

1. 라벨을 2층으로 분리

필드라벨 공간역할
자동화층recoveryType (CaseDomainType)민사 15종 활성 (불변)청구취지·시효·이자계산·도메인 필드·서식 선택
분류층standardCaseName (신규, 선택)법원 표준 사건명 사전 (~300종) + 자유 입력RAG 검색·사무소 기억 매칭·통계·승격 시그널

두 층은 독립이다. 분류층은 모든 사건 (전용 유형 포함) 에 달 수 있고, 자동화층은 기존 의미·동작 100% 유지 (additive optional — 마이그레이션 불요).

2. 표준 사건명 사전 — 큐레이션 자산

  • 위치: packages/business-logic/src/cases/standard-case-names.ts (pure, firebase-admin 의존 0) + deep export ./cases/standard-case-names. ADR 0030 T7 패턴 — Client Component 가 직접 import (자동완성 UI).
  • 구조: name (고유) · group (금전·부동산·임대차·노동·가사·상속·회사· 행정·조세·집행보전·확인 등 실무 분야 그룹) · aliases (통칭 — 예: 건물인도 ↔ 건물명도) · domainTypeHint (전용 유형 매핑 — 대여금→debt 등 확신 매핑만).
  • 사전은 법원 내부 코드의 사본이 아니라 큐레이션 자산. 자유 입력을 항상 허용하므로 사전 누락이 등록을 막지 않는다 (ADR 0052 의 "목록 = 한계" 오인 재발 방지). 누락 사건명은 분포 집계로 드러나 사전에 후속 편입.
  • domainTypeHint 값 ⊂ CIVIL_CASE_DOMAIN_TYPES 는 web 측 parity 테스트가 검증 (pure 파일이 mutation 파일 create.ts 를 import 하지 않기 위한 구조 — 2026-04-29 client bundle 사고 클래스 차단).

3. 입구 — 위저드 Step 1 사건명 검색 + AI prefill

  • Step 1 (유형 선택) 상단에 "사건명으로 찾기" 자동완성: 사건명 선택 시 standardCaseName 설정 + domainTypeHint 로 유형 카드 자동 제안 (무매핑 → general-civil 제안). 라벨 불일치를 입구에서 차단.
  • AI prefill: CasePrefillResponsestandardCaseName 추가 — 소장·계약서 업로드 시 사건명까지 자동 제안.
  • 사건 상세에서 사후 편집 가능 (updateCaseFields 경로).

4. 활용 — RAG 쿼리 토큰

buildRelatedMemoryQuery · buildRagContextQuery 에 standardCaseName 토큰 추가. PII 무전파 원칙 적합 — 표준 분류 용어는 유형·서면·금액 bucket 과 같은 등급 (당사자명·금액 리터럴 아님).

5. 승격 closed-loop

scripts/aggregate-standard-case-name-stats.ts — general-civil 사건의 사건명 분포를 tenantDoc.stats.standardCaseNames 로 30일 롤링 집계 → ops 표면. 다음 Pack 승격 대상을 데이터가 지목 (ADR 0052 비범위 "수요 검증" 의 측정 장치).

6. 스키마 변경 지점 (additive optional)

  • apps/web/types/case.ts Case.standardCaseName?
  • apps/web/app/(workspace)/cases/_lib/schemas.ts CasePayloadSchema
  • packages/business-logic/src/cases/create.ts CreateCaseInputSchema (.strict()web/pkg 동시 변경 필수)
  • apps/web/lib/cases/schemas.ts 위저드 Step 스키마
  • 사건 상세 SSR 직렬화 화이트리스트 (initialCase) — drift 시 silent 누락 (2026-05-05 사고 클래스) 주의

비범위 (후속 판단)

  • 전분야 Pack 자동화 — 분포 데이터 누적 후 승격 의사결정 (본 ADR 은 측정 장치까지만).
  • 형사 활성화 — dormant 유지 (2026-06-01 결정 불변). 사전도 민사·가사· 행정·집행 범위.
  • 기존 사건 일괄 backfill--dry-run 시드 스크립트 제공, 실행은 선택 (recoveryType→대표 사건명 추정 매핑).

영향

  • 목록 외 사건의 라벨 정보 가치 복원 — "general-civil 한 바구니" 해소.
  • 사무소 기억 매칭·RAG 검색의 분류 해상도 상승 (전용 유형 사건 포함).
  • Pack 승격 우선순위가 추측에서 측정으로 전환.