# task-726.1 완료 보고서: 텍스트 포스트 줄바꿈 통일 — _ensure_line_breaks 공유화

**S**: ThreadAuto 시스템에서 카드뉴스 캡션은 `FiveStagePipeline._build_result()`의 `_ensure_line_breaks()` 후처리를 거쳐 줄바꿈이 올바르게 적용되고 있다.

**C**: 그러나 텍스트 포스트는 `run_text_post.py`가 `TextContentGenerator`를 직접 호출하여 `FiveStagePipeline`을 우회하기 때문에, 줄바꿈 후처리가 적용되지 않아 텍스트가 한 덩어리로 올라가는 문제가 발생한다.

**Q**: 카드뉴스 캡션과 텍스트 포스트가 동일한 줄바꿈 함수를 사용하도록 통일할 수 있는가?

**A**: `_ensure_line_breaks()`를 `content/text_utils.py` 독립 함수로 추출하고, `FiveStagePipeline`, `TextContentGenerator`, `run_text_post.py` 3곳 모두에서 호출하도록 통일했다. 기존 148개 테스트 전체 통과, pyright 에러 0건, 신규 유닛테스트 6건 추가.

## 수정 파일 목록

### 신규 파일
- `/home/jay/projects/ThreadAuto/content/text_utils.py` — `ensure_line_breaks()` 공유 유틸 함수
- `/home/jay/projects/ThreadAuto/tests/test_text_utils.py` — 유닛테스트 6건

### 수정 파일
- `/home/jay/projects/ThreadAuto/content/five_stage_pipeline.py` — `_ensure_line_breaks` 메서드 삭제, 공유 함수 import + 호출로 변경
- `/home/jay/projects/ThreadAuto/content/text_generator.py` — `_parse_output()` 후 `ensure_line_breaks()` 호출 추가
- `/home/jay/projects/ThreadAuto/run_text_post.py` — 생성 결과에 이중 보정 추가
- `/home/jay/projects/ThreadAuto/content/text_prompts.py` — 6개 TEXT_SYSTEM_PROMPTS에 줄바꿈 필수 규칙 추가
- `/home/jay/projects/ThreadAuto/tests/test_five_stage_pipeline.py` — `TestEnsureLineBreaks` 클래스 import 경로 수정

## 검증 결과

- pytest: 148 passed (test_text_utils 6건 + test_text_generator 35건 + test_five_stage_pipeline 107건)
- pyright: 0 errors, 0 warnings (5개 대상 파일)
- black/isort: 변경 불필요 (이미 포매팅 적용)
- FiveStagePipeline에서 `_ensure_line_breaks` 메서드 완전 제거 확인 (`hasattr` False)
- `ensure_line_breaks` 함수 module 확인: `content.text_utils`

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **기존 테스트 `TestEnsureLineBreaks`가 인스턴스 메서드 호출** — 독립 함수 import로 전환하여 FiveStagePipeline 의존성 제거
2. **TextContentGenerator에서 줄바꿈 후처리 누락** — `_parse_output()` 직후, `_validate()` 전에 `ensure_line_breaks()` 삽입
3. **text_prompts.py에 줄바꿈 규칙 미명시** — 6개 프롬프트 모두에 줄바꿈 필수 규칙 명시적 추가

## QC 자동 검증 결과

```json
{
  "task_id": "task-726.1",
  "verified_at": "2026-03-20T08:29:41",
  "overall": "PASS",
  "summary": "6 PASS, 4 SKIP",
  "checks": {
    "file_check": "PASS (7/7 파일 존재 확인, 보고서 2720 bytes)",
    "data_integrity": "PASS",
    "tdd_check": "PASS (테스트 2개 + 구현 5개)",
    "pyright_check": "PASS (0 errors, 0 warnings)",
    "style_check": "PASS (black OK, isort OK)",
    "critical_gap": "PASS"
  }
}
```
