# task-721.1: 텍스트 포스트 줄바꿈 강제 후처리 + 프롬프트 강화

## 배경
텍스트 포스트가 줄바꿈 없이 한 덩어리 텍스트로 올라가는 문제 재발.
- 프롬프트(03_writing.md)에 줄바꿈 규칙이 있음에도 Claude가 `\n` 없이 연속 텍스트를 생성하는 경우가 있음
- 예시: "실제 사례 하나 공유하면, 전속 7년차 P설계사가 TOP사업단으로 옮길 때..." 전체가 한 문단으로 올라감
- 스레드 피드에서 가독성 매우 저하

## 수정 대상 파일
1. `/home/jay/projects/ThreadAuto/content/five_stage_pipeline.py`
2. `/home/jay/projects/ThreadAuto/prompts/pipeline/03_writing.md`

## 수정 사항

### 수정 1: five_stage_pipeline.py — 줄바꿈 후처리 추가
`_build_result()` 메서드에서, 텍스트 추출 후 & 자수 트리밍 전에 줄바꿈 보정 로직 추가.

위치: line 296 (text 추출 직후, line 306 자수 트리밍 전)

```python
            # 줄바꿈 보정: \n이 부족하면 문장 경계에서 자동 삽입
            text = self._ensure_line_breaks(text)
```

`_ensure_line_breaks` 메서드 추가:
```python
def _ensure_line_breaks(self, text: str) -> str:
    """텍스트에 줄바꿈이 부족하면 한국어 문장 경계에서 자동 삽입.

    조건: 줄바꿈 없이 50자 이상 연속되는 구간이 있으면 보정.
    """
    if not text:
        return text

    # 이미 충분한 줄바꿈이 있으면 그대로 반환
    lines = text.split("\n")
    avg_line_len = len(text.replace("\n", "")) / max(len(lines), 1)
    if avg_line_len <= 25:  # 평균 줄 길이가 25자 이하면 OK
        return text

    # 문장 경계에서 줄바꿈 삽입
    import re
    # 한국어 문장 종결: 다/요/죠/음/임/됨 + 마침부호, 또는 마침부호 단독
    result = re.sub(
        r'([.!?])\s+',
        r'\1\n\n',
        text,
    )
    # 한국어 종결어미 뒤 공백 → 줄바꿈
    result = re.sub(
        r'((?:다|요|죠|음|임|됨|함|겠다|습니다|세요|거든요|많음|거임|컸다고)[.!?]?)\s+',
        r'\1\n',
        result,
    )

    # 연속 줄바꿈 3개 이상 → 2개로 정리
    result = re.sub(r'\n{3,}', '\n\n', result)

    return result.strip()
```

### 수정 2: 03_writing.md — 줄바꿈 프롬프트 강화
`## text_* 줄바꿈 스타일 (필수)` 섹션 (line 159~164 부근)에 아래 내용 추가:

```
⚠️ 줄바꿈 미포함 시 자동 감점:
- text에 \n이 3개 미만이면 review 단계에서 자동 -20점 감점
- 50자 이상 연속 텍스트(줄바꿈 없이)가 있으면 가독성 실패로 판정
- 반드시 2~3문장마다 \n을 삽입하고, 문단 전환 시 \n\n을 삽입할 것
```

## 검증 방법
1. 기존 테스트 통과: `cd /home/jay/projects/ThreadAuto && python3 -m pytest tests/ -x -q`
2. 후처리 함수 테스트:
   - 줄바꿈 없는 텍스트 입력 → 문장 경계에서 줄바꿈 삽입되는지 확인
   - 이미 줄바꿈 있는 텍스트 → 변형 없이 통과하는지 확인
   - 빈 문자열 → 빈 문자열 반환

## 주의사항
- `import re`는 파일 상단에 이미 있는지 확인 후 중복 추가 금지
- 기존 트리밍 로직 건드리지 말 것 (후처리는 트리밍 전에 실행)
- 카드뉴스 캡션에는 영향 없어야 함 (`content_type.startswith("text_")` 분기 안에서만)
