# task-774.1 완료 보고서

## SCQA

**S**: ThreadAuto 콘텐츠 자동 생성 시스템이 fact_db.md를 단일 소스 오브 트루스로 사용하여 Threads 카드뉴스를 생성하고 있다.

**C**: (1) "조직장"이라는 업계 비표준 용어가 evergreen_topics.json에 4건 사용되고 있었고, 프롬프트에 금지 가드레일이 없어 LLM이 생성 시 사용할 수 있었다. (2) 인카금융서비스 전체 데이터(설계사 2만명, 수수료 매출 2,236억 등)와 TOP사업단 자체 데이터가 구분 없이 관리되어, TOP사업단 콘텐츠에 인카금융서비스 전체 수치가 오인 사용될 위험이 있었다.

**Q**: 용어 교정과 데이터 귀속 구분을 적용하여 콘텐츠 정확도를 확보할 수 있는가?

**A**: fact_db.md에 용어 규칙(§13)과 데이터 귀속 구분(§14) 섹션을 추가하고, prompts.py SYSTEM_PROMPT에 2개 가드레일을 삽입했다. fact_guard.py에 `validate_banned_terms()`와 `validate_data_attribution()` 검증 함수를 TDD로 구현하여 런타임 차단을 지원한다. pytest 51건 전체 통과(기존 36 + 신규 15), pyright 0 에러, "조직장" 콘텐츠 사용 0건 달성.

---

## 수정/생성 파일 목록

- `/home/jay/projects/ThreadAuto/content/fact_db.md` — §13 용어 규칙 + §14 데이터 귀속 구분 신규 섹션, 기존 수치에 귀속 태그 추가
- `/home/jay/projects/ThreadAuto/content/prompts.py` — SYSTEM_PROMPT [절대 금지사항]에 "조직장" 금지 + 데이터 귀속 오인 금지 2개 항목 추가
- `/home/jay/projects/ThreadAuto/content/fact_guard.py` — `validate_banned_terms()`, `validate_data_attribution()` 함수 + TypedDict 2개 + 상수 3개 추가
- `/home/jay/projects/ThreadAuto/content/evergreen_topics.json` — "조직장" 4건 → "본부장"/"본부장·지점장"으로 교체
- `/home/jay/projects/ThreadAuto/tests/test_fact_guard.py` — TestBannedTerms(7개) + TestDataAttribution(8개) 테스트 추가

---

## 테스트 결과

- pytest: **51 passed** in 0.11s (기존 36 회귀 없음 + 신규 15 통과)
- pyright: **0 errors**, 0 warnings
- black/isort: 포매팅 준수
- "조직장" grep: 금지 규칙 설명 맥락 3건만 존재 (fact_db.md §13 정의, prompts.py 금지 규칙, fact_guard.py BANNED_TERMS 딕셔너리)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **evergreen_topics.json "조직장" 4건** — 문맥별로 "본부장" 또는 "본부장·지점장"으로 교체
2. **fact_db.md 수치 귀속 미구분** — 섹션 1에 [TOP사업단], 섹션 3에 [인카금융서비스 다이렉트] 태그 추가
3. **fact_guard.py 데이터 귀속 검증 부재** — `validate_data_attribution()` 함수로 TOP 맥락 + 인카 수치 오용 감지 구현

### 범위 외 미해결 (0건)
없음.

---

## 설계 결정 사항

- `validate_data_attribution()`은 3단계 필터: (1) 빈 텍스트 → PASS (2) TOP 맥락 없음 → PASS (3) "인카금융서비스" 명시 → PASS. 세 조건 모두 통과 시에만 _INCAR_ONLY_NUMBERS 대조
- 금지 용어 "조직장"은 BANNED_TERMS 딕셔너리로 관리하여 향후 확장 용이
- 기존 validate_numbers()와 독립 동작 (기존 API 변경 없음)
