# task-736.1: ThreadAuto 수치 환각 방지 3중 안전장치 구축 [긴급]

## 배경 (심각)
AI가 fact_db.md에 없는 수치 "비상장 GA 이직률 50%"를 환각으로 생성하여 Threads에 게시됨.
**실제 수치가 아닌 내용이 게시되면 금소법 위반 → 벌금 대상.**
절대 다시 발생하면 안 되는 최우선 이슈.

## fact_db 위치
`/home/jay/projects/ThreadAuto/content/fact_db.md` — 콘텐츠 생성의 유일한 팩트 소스

## 작업 지시 (3단계)

### 1단계: 프롬프트 강화
1. `/home/jay/projects/ThreadAuto/content/text_prompts.py` 수정:
   - "수수료율, 정착지원금, 이직률 등 실제 수치 기반" ← 여기서 "이직률" 제거
   - fact_db에 실제로 있는 수치 항목만 예시로 남길 것
   - 다음 규칙 추가: **"숫자+단위(%, 억, 명, 원, 배 등) 사용 시 반드시 fact_db.md에 있는 수치만 사용. fact_db에 없는 수치는 절대 생성 금지. 위반 시 금소법 위반."**

2. `/home/jay/projects/ThreadAuto/prompts/pipeline/03_writing.md` 수정:
   - 동일한 수치 사용 금지 규칙 추가
   - 기존 금지사항 섹션에 병합

3. `/home/jay/projects/ThreadAuto/prompts/pipeline/04_hooking.md` 수정:
   - "인용 가능 수치" 목록이 있음 → fact_db와 정확히 일치하는지 확인, 불일치 수정
   - 동일한 수치 사용 금지 규칙 추가

4. 기타 프롬프트 파일 전수 확인:
   - `/home/jay/projects/ThreadAuto/prompts/` 하위 모든 .md 파일
   - `/home/jay/projects/ThreadAuto/content/` 하위 모든 .py 파일
   - "수치", "숫자", "통계", "데이터" 언급하는 프롬프트에 금지 규칙 추가

### 2단계: 업로드 전 자동 수치 검증 모듈
새 파일 생성: `/home/jay/projects/ThreadAuto/content/fact_guard.py`

```python
# 핵심 로직:
# 1. fact_db.md 파싱 → 허용 수치 목록 추출
# 2. 텍스트에서 숫자 패턴 추출 (정규식: N%, N억, N명, N원, N배, N개, N회 등)
# 3. 허용 수치와 대조
# 4. 불일치 발견 시 FactGuardError 발생 (업로드 차단)

def validate_numbers(text: str) -> dict:
    """
    Returns {"passed": bool, "violations": [...], "found_numbers": [...]}
    violations에 fact_db에 없는 수치 목록
    """

def load_allowed_numbers(fact_db_path: str) -> set:
    """fact_db.md에서 모든 수치+단위 추출"""
```

### 3단계: fact_db 허용 수치 화이트리스트 + 통합
1. `fact_guard.py`의 `load_allowed_numbers()`가 fact_db.md를 매번 파싱하여 화이트리스트 생성
   - 별도 JSON 파일 대신 fact_db.md를 직접 파싱 (소스 오브 트루스 단일화)
   - 캐싱은 선택적 (fact_db 수정 빈도 낮음)

2. 검증 로직을 업로드 경로에 통합:
   - `/home/jay/projects/ThreadAuto/run_text_post.py` — 업로드 직전에 `validate_numbers()` 호출
   - `/home/jay/projects/ThreadAuto/run_full_pipeline.py` — 캡션 생성 후 업로드 전에 `validate_numbers()` 호출
   - 검증 실패 시 업로드 중단 + 에러 로그 출력 + 재생성 시도 (최대 2회)

3. 허용해야 할 일반 숫자 예외 처리:
   - 날짜 관련 (2026년, 3월 등)
   - 순서/번호 (1번, 제2조 등)
   - 일반 표현 (하나, 한 번 등)
   - 해시태그 안의 숫자
   - 이런 것들은 검증 대상에서 제외

## 검증 기준
1. fact_db.md에 있는 수치로 텍스트 생성 → validate_numbers() PASS 확인
2. fact_db.md에 없는 수치("이직률 50%") 포함 텍스트 → validate_numbers() FAIL + 차단 확인
3. 날짜/순서 등 일반 숫자 → 예외 처리 확인
4. run_text_post.py, run_full_pipeline.py 실행 시 검증 로직 동작 확인

## 테스트
- `test_fact_guard.py` 작성 필수
- 최소 테스트 케이스:
  - PASS: "설계사 2만명 돌파" (fact_db에 있음)
  - PASS: "정착지원금 최대 50%" (fact_db에 있음)
  - FAIL: "이직률 50%" (fact_db에 없음)
  - FAIL: "연봉 3000만원" (fact_db에 없음)
  - PASS: "2026년 3월" (날짜 예외)
  - PASS: "1:1 밀착 코칭" (일반 표현 예외)

## 핵심 원칙
- **금소법 위반 방지가 최우선** — 의심스러우면 차단이 맞음
- fact_db.md = 유일한 소스 오브 트루스
- 검증을 통과하지 못한 콘텐츠는 절대 게시되면 안 됨
