---
tags: [plans, naverworks, briefing, insight, llm, langgraph]
---

# NAVER WORKS 브리핑 인사이트 서두 누출 수정 계획

**작성일**: 2026-03-11
**상태**: 완료 (2026-03-11)
**목표**: NAVER WORKS 브리핑 인사이트가 금지 서두 없이 분류 문구로 바로 시작하도록 출력 계약을 고정한다.

## 관련 문서
- [NAVER WORKS 브리핑 인사이트 서두 문구 누출](../troubleshooting/260311_naverworks_briefing_insight_preamble_leak.md)
- [NAVER WORKS 브리핑 인사이트 서두 누출 종료 리서치](../research/260311_naverworks_briefing_insight_preamble_leak_closure_research.md)
- [프롬프트 DB 부분 도입 및 하드코딩 프롬프트 잔존](../troubleshooting/260311_prompt_db_partial_adoption_and_hardcoded_prompts.md)
- [NAVER WORKS 브리핑 인사이트 서두 누출 수정 및 수동 배포 검증](../worklog/260311_naverworks_briefing_insight_preamble_leak_fix_and_manual_deploy.md)

## 1. 문제 정의
- `NAVER WORKS Daily Briefing`은 실행과 전송은 성공했지만, 인사이트 앞에 `로빙입니다`, `사용자님께서는`, `요약해 드리겠습니다` 같은 서두가 붙은 채 Slack에 노출됐다.
- 현재 프롬프트는 `인사말, 서두 없이 바로 내용 시작`을 요구하지만, 실제 출력값을 통과시키기 전 검증 계약이 없다.
- 따라서 이번 문제는 `프롬프트 실패`가 아니라 `LLM 출력 검증 부재` 문제로 본다.

## 2. 이번 계획의 결정
- 이 문제는 `LangGraph`를 버리거나 `Pydantic AI`를 새로 도입해서 닫지 않는다.
- 현재 브리핑 플로우 안에서 `generate -> validate -> regenerate 1회 -> fail visible` 계약을 추가해 닫는다.
- 알려진 금지 서두 제거는 허용하되, 기준 미달 출력을 성공처럼 전송하지 않는다.

## 3. 범위
- 포함:
  - NAVER WORKS 브리핑 인사이트 생성 프롬프트 보강
  - 인사이트 검증/정규화 단계 추가
  - 금지 케이스 테스트 추가
  - 실패 로그 가시성 보강
- 제외:
  - Prompt DB 전면화
  - 다른 브리핑 skill 전수 수정
  - 공통 LLM 출력 정책 프레임워크 신설

## 4. 구현 원칙
- 프롬프트에만 의존하지 않는다.
- 금지 출력은 다음 단계로 그대로 보내지 않는다.
- 정규화로 해결되지 않는 출력은 실패로 남긴다.
- 실패는 로그에 명확히 드러나야 하며, 성공처럼 포장하지 않는다.

## 5. 구현 단계

### A. 프롬프트 보강
- 인사이트가 반드시 `회신 필요`, `결제/청구`, `안내/공지` 중 하나로 시작하도록 명시한다.
- `로빙입니다`, `사용자님께서는`, `요약해 드리겠습니다`, `오늘 알아야 할 메일 핵심 내용을` 같은 서두를 금지 예시로 직접 적는다.

### B. 검증 단계 추가
- `_generate_insight()` 직후 또는 그 다음 단계에 `validate_insight()`를 둔다.
- 검증 항목:
  - 금지 서두 포함 여부
  - 허용 시작 패턴 여부
  - 1줄 요약 여부

### C. 재생성 1회
- 첫 생성 결과가 검증에 실패하면 같은 요청으로 1회만 재생성한다.
- 재생성 결과도 실패하면 알려진 서두 제거만 시도한다.
- 서두 제거 후에도 허용 시작 패턴이 아니면 전송하지 않고 실패로 남긴다.

### D. 실패 가시성
- `Generated insight:` 로그에 원문과 판정 결과가 남아야 한다.
- 검증 실패, 재생성 시도, 최종 실패는 구분되는 로그 메시지로 남긴다.
- `Briefing sent successfully`는 실제 검증을 통과한 경우에만 남긴다.
- 이번 이슈 범위에서는 DB 적재가 아니라 애플리케이션 구조화 로그로 남긴다.
- 권장 로그 필드:
  - `event=briefing_insight_validation`
  - `stage=first_pass|retry|final`
  - `raw_insight`
  - `normalized_insight`
  - `decision=pass|retry|fail`
  - `reason=forbidden_preamble|invalid_prefix|not_one_line`
  - `retry_count=0|1`

### E. 테스트 추가
- 단위 테스트:
  - 정상 시작 패턴 통과
  - 금지 서두 포함 시 실패 또는 정규화
  - 재생성 후 정상화
  - 재생성 후에도 기준 미달이면 실패
- 금지 케이스 예시:
  - `로빙입니다... 회신 필요 1건`
  - `사용자님께서는... 결제/청구 1건`
  - `오늘 알아야 할 메일 핵심 내용을... 안내/공지 3건`

## 6. 완료 판정 기준
- 실제 생성값과 Slack 노출값 모두에서 금지 서두가 0건이다.
- 인사이트는 `회신 필요`, `결제/청구`, `안내/공지` 중 하나로 시작한다.
- 금지 케이스 테스트가 추가되고 모두 통과한다.
- 검증 실패 출력은 성공 전송 로그로 남지 않는다.

## 7. 후속 경계
- 이 계획이 끝나도 Prompt DB 미전면화 문제는 별도 트러블로 유지한다.
- 공통 브리핑 계층 확장은 이번 이슈를 닫은 뒤 별도 계획으로 다룬다.
