ADR 0033 — 일간 법률 뉴스 AI 큐레이션
Context
대시보드 일간 브리핑 (tenants/{tid}/dailyBriefings/{YYYY-MM-DD}) 은 그 사무소의 사건·기일·메시지에 한정된 "내 일정 요약". 외부 법률 동향 (판례, 법령 개정, 입법 동향) 은 변호사가 별도 채널 (법률신문, 법률저널, 인링크 등) 을 매일 직접 모니터링해야 했고, 우리 제품 안에는 채널이 없었다.
요구사항:
- AI 가 매일 한 번 한국 법률 관련 동향을 자동 수집·요약해 사무소에 노출
- 운영자가 결과 품질을 즉시 검증 (24h Cloud Scheduler 대기 금지) → ops 콘솔 버튼 클릭 → 즉시 fetch
- Phase 별 출시: Phase 1 ops 검증 도구 → Phase 2 Cloud Scheduler 자동화 → Phase 3 web 노출 (일간 브리핑 통합 또는
/library/news별도 메뉴)
Decision
데이터 모델
legalNewsDaily/{YYYY-MM-DD} — 전 사용자 공유 (tenant 경로 밖, masterAdmin write · 인증 사용자 read).
interface LegalNewsDailyDoc {
dateKey: string; // KST yyyy-MM-dd
fetchedAt: Timestamp; // 수집 시각
fetchedBy: string; // ops uid (수동) 또는 "scheduler" (Phase 2)
status: "draft" | "approved" | "rejected";
// draft: 수집만 완료, web 노출 X
// approved: ops 검증 통과, web 노출 가능 (Phase 3)
// rejected: 품질 미달, 재수집 필요
headline: string; // "오늘의 법률 동향 한 줄 요약"
items: Array<{
id: string; // 결정적 (slug 기반)
title: string;
summary: string; // 2-3 문장
url: string; // grounding citation
publishedHint: string; // "최근" 또는 "2026-04-28" — LLM 판단
packTags: Array<"debt" | "divorce" | "property" | "inheritance" | "contract">;
severity: "high" | "medium" | "low";
}>;
model: string; // "gemini-2.0-flash-001"
retrievalMs: number; // Vertex 호출 시간 (성능 추적)
// Phase 2 후속 — RSS 보강 시 출처 메타 추가
sources?: Array<{ name: string; url: string; itemCount: number }>;
}
수집 파이프라인 (Phase 1)
책임 분리 (ADR 0004 §4 / CLAUDE.md "Gemini 호출은 클라이언트 전용" 정합):
| 레이어 | 책임 | 위치 |
|---|---|---|
| Client component | LLM 호출 (firebase/ai SDK + Google Search grounding) | apps/ops/app/(ops)/scenarios/_components/cards/legal-news/FetchLegalNewsScenarioCard.tsx |
| Pure 함수 | 프롬프트 빌더 + JSON 응답 파서 + URL → 결정적 id | packages/business-logic/src/legal-news/llm-prompt.ts |
| Server Action | 인증 + Firestore write 위임 | apps/ops/app/(ops)/scenarios/_actions/run-fetch-legal-news-scenario.ts |
| Mutation | Zod 재검증 + Firestore write | packages/business-logic/src/legal-news/fetch-news.ts (saveLegalNewsDailyDoc) |
| 모델 SSoT | 모델 ID 단일 참조점 | apps/ops/lib/ai/model.ts (AI_MODEL) |
흐름:
- Client →
getGenerativeModel(ai, { model: AI_MODEL, tools: [{ googleSearch: {} }] }).generateContent(prompt)(firebase/ai SDK) - 응답 텍스트 →
parseLegalNewsLlmResponse(pure, ```json fence 추출 + Zod 검증) - parsed 결과 → Server Action 으로 전송 (model · retrievalMs 포함)
- Server Action →
saveLegalNewsDailyDoc→legalNewsDaily/{YYYY-MM-DD}write
모델 hardcode 정책:
호출부 (ops 카드 / business-logic mutation) 에 모델명을 적지 않는다. 모델은 SSoT 1곳 (apps/ops/lib/ai/model.ts) 에서만 변경. 향후 packages/ai 패키지 승격 시 web 의 apps/web/lib/ai/providers/gemini.ts 와 통합.
ADR 0028 패턴 — 비즈니스 로직은 packages, Server Action 은 thin wrapper (auth + Firestore write).
검증 UX (Phase 1)
ops 시나리오 페이지에 신규 카테고리 legal-news:
fetchLegalNewsToday카드 — 버튼 클릭 → 즉시 fetch + Firestore write + 결과 카드에 표시 (headline + items 5건 + citation URL). 24h 대기 X.- (후속)
regenerateSummary(raw 보존된 날짜 LLM 만 재호출),approveLegalNews(status 전이) 는 PR-2/PR-3.
Phase 2 — Cloud Scheduler 자동화
검증 끝나면 functions/src/scheduled-fetch-legal-news.ts 추가, 매일 06:00 KST 실행. ops 수동 트리거와 같은 함수 (fetchAndSummarizeLegalNews) 호출 — drift 0.
Phase 3 — web 노출
옵션 (1차 = 통합, 양립 가능):
- (a) 일간 브리핑 통합 —
apps/web/app/(workspace)/dashboard의 브리핑 카드 하단 "오늘의 법률 동향 3건" 섹션 추가. 사용자 별도 진입 0. - (b)
/library/news별도 메뉴 — 컨텐츠 양 늘어나면 검색·필터·즐겨찾기 가능한 별도 화면. (a) 와 양립.
출처 신뢰성 (Phase 3 노출 전)
Gemini Grounding 만으론 출처가 블로그 등 신뢰성 낮을 수 있음. Phase 3 web 노출 전 다음 보강:
- Phase 2 후반: RSS 1차 소스 (대법원 보도자료, 법무부) 보강 →
sources메타 채움 - ops 검증 카드에서
severity: "high"항목은 사람이 reviewed 한 항목만 노출
Consequences
Pros:
- 변호사가 매일 외부 채널 모니터링 시간 절감 (≥ 30분/일)
- 우리 제품의 일간 진입 가치 ↑ (사무소 일정 + 외부 동향 한 화면)
- ADR 0028 / 0032 인프라 재사용 — 신규 패턴 0
- Phase 1 = ops 도구만, web 영향 0 → 검증 이전 사용자 노출 사고 차단
Cons:
- Gemini Grounding 토큰비 (1일 1회 약 $0.005-0.01, 무시 가능)
- 출처 신뢰성 검증 필요 — Phase 3 전 RSS 보강 또는 사람 review gate 필수
- LLM 비결정성 — 같은 날 다른 시간 호출 시 일부 다른 결과 (Phase 2 자동화에서는 06:00 1회 고정)
Flag/rollback: Phase 3 노출은 config/appMetadata.features.ai.dailyLegalNews (기본 false) 로 감싸 1-click 끄기.
Alternatives considered
- RSS only — 안정적·결정적이지만 한국 법률 사이트 RSS 빈약 (대법원·법무부 등 일부만, 법률신문은 없음). 큐레이션 비용 > Grounding.
- News API (NewsAPI.org 등) — 한국 법률 컨텐츠 빈약, 영문 뉴스 위주. 부적합.
- Tenant 별 큐레이션 — 사무소 사건 (recoveryType) 에 매칭되는 뉴스만 필터. Phase 1 에서는 비용·복잡도 over-engineering. 전 사용자 공유 1 doc + 클라이언트 packTags 필터로 충분.
Related
- ADR 0028 (비즈니스 로직 추출) — 동일 패턴 재사용
- ADR 0032 (RAG 평가) — Vertex AI Gemini 호출 인프라 공유
- CLAUDE.md "Firebase AI Logic" — 클라이언트 호출 정책. 본 기능은 server-only (Vertex REST), 클라이언트 호출 0.