본문으로 건너뛰기

ADR 0056: 서류 우선 작성 → 사건 승격

5인 역할 회의(R1 독립 발산 → R2 상호 반박 → R3 수렴)의 결정. P1 변호사·P2 사무장·P3 PM·P4 디자이너·P5 개발자.

배경

현재 너홀로프로는 사건 등록(3단계 위저드: 유형→당사자→도메인정보)이 모든 서류 작성의 선행 필수다. 서류 작성 경로 둘(/docs/generate, /docs/catalog) 모두 form.caseId 를 강제하므로(DocStep2FillInfo.tsxmissingFields, docs/generate/_lib/schemas.tscaseId: z.string().min(1)), "상담 직후 일단 내용증명/소장 초안부터 빨리 만들고 싶다"는 변호사의 일상적 니즈가 막혀 있다.

P1(변호사)·P2(사무장) 모두 "사건 없이 서류부터"는 예외가 아니라 일상이라 확인했다 — 채권 회수는 시효 중단(최고)이 걸려 수임계약 전에 내용증명이 먼저 나가고, 가압류·가처분은 당일 신청서를 써야 하며, 의뢰인이 "승소 가능성 보고 결정"하며 소장 초안만 먼저 요청하기도 한다. 셋 다 서류는 급한데 수임은 미확정이다.

결정

1. 사건 없이 바로 서류 작성 진입 — 신규 라우트·엔티티 0

/docs/generate 의 Step 2 "사건 연결" 카드에 세그먼트 2개(① 기존 사건 ② 사건 없이 작성) 만 추가한다. 사건은 "데이터 소스"이지 "관문"이 아니다 — 기존 사건 선택 시 auto-fill 하던 당사자·금액·법원을 사건 없이 들어오면 사용자가 직접 입력한다. 진입점은 기존 표면(카탈로그 카드·서류 센터 빈 상태·대시보드)의 ?docType= deep-link 를 그대로 재사용한다. (P4)

2. 미승격 데이터 = localStorage only — "서버에 떠도는 사건 미연결 서류"는 만들지 않는다

사건 없이 작성하는 동안 데이터는 기존 localStorage draft 인프라(useDocGenerate.tsdocgen:draft:v2.64:... 키, 1h TTL·자동 복원·삭제)에만 둔다. 사건 없는 변형 키(예: docgen:draft:v2.64:__nocase__:DOCTYPE)로 확장하면 신규 컬렉션·스키마·rules·정리 cron 이 0이다. (P5)

  • 빈 사건 stub(b) 거부: createFullCaseAction 의 활성 사건 한도 카운트를 빈 껍데기가 잠식하고, 포털·기일이 빈 사건을 정상 사건으로 오인.
  • 별도 draftDocuments 컬렉션(c) 거부: 스키마·저장·조회·rules·승격 마이그레이션 전부 신규 분기, 이득은 "기기 동기화" 정도로 한 줄 본질 기여 0.

3. 보존이 필요하면 사건 또는 상담으로 명시 귀속 — 미승격의 안식처는 상담

핵심 발견: 이해충돌 검색(conflict-check-action.ts)은 cases + consultations 두 컬렉션을 모두 스캔한다(source: "case" | "consultation"). 따라서 미승격 초안의 당사자를 상담(consultation)으로 보관하면:

  • 이해충돌 자동 포함(P1 — 미승격 초안 당사자가 검색에 안 잡히면 변호사법 §31 위반 사고)
  • "미수임 상담 = 자산"(P2 — ADR 0049 보관함, ADR 0055 회상 RAG)
  • 사건 전환 인프라 재사용(markConsultationConvertedconvertedCaseId 연결 + 경위→memo 이관)

새 "초안 보관" 개념을 만들 필요가 없다. 미승격 보존 = 상담 귀속.

4. 승격 = 저장/보관 시점 모달 1회 (명시 선택, 자동 승격 ✗)

작성·다운로드는 귀속 없이 가능(가벼움 유지). 사용자가 "시스템에 보관"을 누르는 순간에만 모달 1회:

이 서류를 어떻게 보관할까요?
① 새 사건 등록 (수임 확정) ← primary
② 기존 사건에 연결 (의뢰인·상대방 자동 후보)
③ 상담으로 보관 (수임 미정 — 나중에 사건 전환)
(저장 안 함 → localStorage 1h 후 소멸)
  • 진입 강제·작성 중 배너 모두 ✗ — "바로 서류"의 가벼움을 해친다. 결과물이 손에 잡힌 저장 시점이 유일하게 자연스러운 모먼트(P4). 변호사가 "① 새 사건 등록"을 누르는 행위 = 수임 확정 의사(P1) → 세 시점(저장/finalize/수임확정)이 한 모먼트로 통합.
  • 승격 시 사건 유형(도메인 14종)은 본문 텍스트를 generateCasePrefill 에 태워 추론→모달에 미리 채움(P4). docType("소장")만으론 도메인이 안 나오므로 필수.
  • createCase 필수 필드(주소 등 .min(1)) 와 docgen 폼의 갭은 승격 모달에서 보완 입력(P5).

5. "연습"(목표 3) — 독립 모드 폐기

연습은 별도 엔티티·라우트가 아니라 빈 상태/온보딩 카피("사건 없이 먼저 한 장 만들어 보세요")로 같은 generate 흐름에 태운다. 변호사는 연습하지 않고(P1), 더미 데이터 경로는 유지보수 부채일 뿐이다(P3). 미승격 작성물 = localStorage 단발로 이미 "연습"을 흡수한다.

6. 성공 지표 = 승격 전환율 (서류 생성 건수 ✗)

단일 KPI는 "사건 없이 서류 작성 진입 → 사건/상담 귀속 전환율(promotion rate)". "서류 생성 건수"를 보면 무의식적으로 서류 생성기를 최적화하게 된다(P3 — 측정하는 것이 만들어진다). 미승격 단발은 KPI 성공이 아니다. 사전 임계치: 승격률이 지속적으로 낮으면(예: 40% 미만) 동선 자체를 재검토.

대안 검토

대안거부 이유
완전 분리(서류만 만들고 버림)RAG 학습 trigger(on-document-finalized.ts)가 cases/CASEID/documents 경로라 사건 없으면 학습 신호가 물리적으로 불가 = 한 줄 본질 위배
빈 사건 stub / 별도 draft 컬렉션결정 2 참조 — 한도 잠식·정리 부채·신규 분기
작성 즉시 자동 승격수임 무산 건까지 정식 사건으로 쌓여 사건 목록·회수율 통계 오염(P1)
독립 연습 모드결정 5 — 과설계·더미 데이터 부채

Minority Report (반대의견)

  • P3 (PM): 승격 모달의 ③ 상담 보관은 MVP 스코프 확대 우려. PM 관점에선 ①②(사건 승격)만으로 시작하고 ③은 데이터를 보고 추가하길 선호. → 반영: 구현 로드맵에서 ③을 별도 PR(PR-3)로 분리해, ①②(PR-1·2) 먼저 출시 후 도입. 단 P1의 이해충돌 요구는 법적 필수라 ③ 자체는 폐기하지 않음.
  • P5 (개발자): 저장소 이원화(저장 경로 flat tenants/TID/documents vs RAG trigger cases/CASEID/documents)는 사건 없는 작성과 무관하게 기존 docgen 도 학습 루프에 제대로 들어가는지 선결 점검이 필요하다는 입장. 이 동선 작업이 그 문제를 키울 수 있으므로 후속 과제 1번으로 못 박음.

후속 과제 (구현 로드맵 — PR 단위)

  1. PR-1: Step 2 "사건 없이 작성" 세그먼트 + 사건 없는 localStorage draft 키 + 작성·다운로드 귀속 없이 허용 (저장 가드만 분기).
  2. PR-2: 승격 모달(저장 시점) — ① 새 사건 등록 / ② 기존 사건 연결(의뢰인·상대방 자동 후보). 본문 prefill 추론으로 유형·당사자 미리 채움 + 누락 필드 보완.
  3. PR-3: 승격 모달 ③ 상담 보관 (markConsultationConverted 패턴 재사용) — 이해충돌·회상 RAG 자동 포함.
  4. PR-4: 빈 상태/온보딩 카피 + 승격 전환율 텔레메트리(KPI 계측).
  5. 선결/병행: 저장소 이원화 정합 점검 — 승격(및 기존) 서류가 cases/CASEID/documents 로 finalize 돼 RAG 학습에 들어가는지 검증(P5 Minority).검증 완료 (2026-06-29) — 결과: 미진입(단절 확정). golden QA tenant 실측 + 코드 grep 으로, docgen 주 동선(/docs/generatesaveDocWithHtmlActiondocsRef = tenants/{tid}/documents flat 서류센터)은 cases/{caseId}/documents finalize 경로가 아니므로 onEditableDocumentFinalized 트리거(tenants/{tenantId}/cases/{caseId}/documents/{docId} 바인딩)가 물리적으로 발화하지 않아 학습에 진입하지 않는다. P5 Minority 가 우려한 단절이 사실로 확정. 해소책 = ADR 0059 — docgen 학습 단절 해소 (편집기 유도 동선): docgen Step3 에 비강제 "편집기에서 다듬어 확정" CTA → openTextInEditorAction 재사용 → finalize(strict redact) → authored. docgen 직접 편입은 PII raw 통과·품질 오염·#3113 위배로 거부.

변경 이력

  • 2026-06-14 (초안, Accepted): 5인 역할 회의(R1→R3) 수렴. 사건 없이 바로 서류 작성 + 미승격 = 상담/사건 귀속 결정. P5 Minority Report 가 "저장소 이원화(flat tenants/documents vs RAG trigger cases/CASEID/documents)로 기존 docgen 도 학습에 들어가는지 선결 점검" 을 후속 과제 #5 로 못 박음.
  • 2026-06-29 (후속 과제 #5 종결): golden QA tenant 실측 + 코드 grep 으로 docgen 주 동선의 학습 미진입(단절) 확정. P5 Minority 의 우려가 사실임을 검증. 해소는 신규 ADR 0059(편집기 유도 동선)로 분리. 본 ADR 의 승격 모달(결정 4)은 ADR 0059 에서 caseId 확보 동선으로 재사용된다.

성공 판정

  • 사건 없이 서류 작성 진입 가능 + 작성·다운로드가 귀속 없이 동작
  • 저장 시 사건/상담 귀속 모달이 1회 노출(자동 승격 없음)
  • 미승격 데이터가 서버에 사건 미연결로 잔존하지 않음(localStorage TTL 소멸)
  • 상담 귀속 시 이해충돌 검색에 당사자가 잡힘
  • 승격 전환율 KPI 계측 가능