# task-674.1 완료 보고서

## SCQA

**S**: ThreadAuto 카드뉴스 렌더러가 5종 테마(NavyGold, BlackRed, GreenWhite, PurplePink, OrangeCream)로 멀티슬라이드 카드뉴스를 생성하여 Threads에 자동 업로드하고 있다.

**C**: `_draw_info_box` 메서드에서 `text_primary_rgb`에 `_ensure_contrast()` 대비 체크가 누락되어 있었고, `text_secondary_rgb`의 대비 기준이 카드 유효 배경(`_eff_card_bg`) 대신 그라디언트 배경(`_eff_bg`)을 사용하고 있어, 밝은 테마(GreenWhite, OrangeCream)에서 본문 가독성이 저하될 위험이 있었다. 또한 `03_writing.md`에 콘텐츠 정체성 규칙 상세 spec 참조가 누락되어 있었다.

**Q**: `_draw_info_box`의 대비 로직을 카드 유효 배경 기준으로 보정하고, 콘텐츠 정체성 규칙 참조를 추가하여 밝은 테마에서의 가독성과 콘텐츠 품질을 동시에 확보할 수 있는가?

**A**: `_draw_info_box`에 `_ensure_contrast(theme.text_primary, _eff_card_bg)` 적용 + 대비 기준을 `_eff_card_bg`로 변경하여 해결. 5개 테마 전부 렌더링 성공, pytest 89건 전체 통과 (기존 84 + 신규 5), pyright 에러 0건. 카드뉴스 1건 Threads 업로드 성공 (포스트 ID: 17885915772460792).

---

## 수정 파일 목록

- `/home/jay/projects/ThreadAuto/renderer/cardnews.py` — `_draw_info_box` 대비 로직 수정
- `/home/jay/projects/ThreadAuto/tests/test_cardnews_renderer.py` — 대비 검증 테스트 5건 추가
- `/home/jay/projects/ThreadAuto/prompts/pipeline/03_writing.md` — 콘텐츠 정체성 규칙 상세 spec 참조 추가

## 생성 파일 목록

- `/home/jay/projects/ThreadAuto/output/contrast_test/detail_*.png` — 5개 테마 대비 검증 이미지
- `/home/jay/projects/ThreadAuto/output/test_contrast_verification.py` — 대비 검증 스크립트
- `/home/jay/projects/ThreadAuto/output/upload_contrast_test.py` — 업로드 테스트 스크립트
- `/home/jay/projects/ThreadAuto/output/cardnews_20260318_022917_0*.png` — 업로드된 카드뉴스 5장

---

## 상세 변경 내역

### 1. _draw_info_box 대비 수정 (cardnews.py:719-727)

**변경 전:**
```python
text_primary_rgb = hex_to_rgb(theme.text_primary)  # _ensure_contrast 미적용
_eff_bg = _get_effective_bg(theme.bg_gradient)
_safe_secondary_hex = _ensure_contrast(theme.text_secondary, _eff_bg)  # 기준이 bg_gradient
```

**변경 후:**
```python
_eff_bg = _get_effective_bg(theme.bg_gradient)
_eff_card_bg = _get_effective_card_bg(theme.bg_gradient, theme.card_bg)
text_primary_rgb = hex_to_rgb(_ensure_contrast(theme.text_primary, _eff_card_bg))
_safe_secondary_hex = _ensure_contrast(theme.text_secondary, _eff_card_bg)
```

**근거**: info box 텍스트는 glass card 위에 렌더링되므로, 대비 기준을 카드 유효 배경(그라디언트 + card_bg 알파 블렌딩 결과)으로 변경.

### 2. 03_writing.md 상세 참조 추가

`## 콘텐츠 정체성 규칙` 섹션에 `> 상세 규칙: /home/jay/workspace/memory/specs/content-identity-rules.md 참조` 인용 추가.

### 3. master_brief.md

이미 콘텐츠 정체성 규칙 + 상세 참조가 포함되어 있어 변경 불필요 (line 129-148).

---

## 테스트 결과

### pytest
- **89건 전체 통과** (기존 84 + 신규 TestInfoBoxContrastFix 5건)
- 신규 테스트: `test_ensure_contrast_bright_bg_returns_dark_text`, `test_ensure_contrast_dark_bg_returns_bright_text`, `test_get_effective_card_bg_blends_card_and_gradient`, `test_info_box_text_primary_uses_card_bg_contrast`, `test_info_box_text_uses_card_bg_not_raw_bg_gradient`

### pyright
- 에러 0건, 경고 0건

### 대비 검증 (밝은 테마)
- GreenWhite: eff_card_bg lum=0.994 (밝음), primary #1A2E20 → 유지, secondary #2D5A3D → 유지 (이미 충분히 어두움)
- OrangeCream: eff_card_bg lum=0.984 (밝음), primary #2C1500 → 유지, secondary #7A4020 → 유지 (이미 충분히 어두움)
- 5개 테마 전부 렌더링 성공, 시각적 가독성 확인 완료

### Threads 업로드
- 성공 여부: True
- 포스트 ID: 17885915772460792
- 이미지 5장 생성 + 업로드 완료
- 에러: 없음 (Firestore ADC 경고는 로컬 fallback, 기능 영향 없음)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **`_draw_info_box`에서 text_primary에 _ensure_contrast 미적용** — `_ensure_contrast(theme.text_primary, _eff_card_bg)` 적용으로 해결
2. **`_draw_info_box`에서 대비 기준이 _eff_bg (그라디언트)** — `_eff_card_bg` (카드 유효 배경)로 변경
3. **`03_writing.md`에 spec 참조 누락** — `> 상세 규칙: .../content-identity-rules.md 참조` 추가

### 범위 외 미해결 (1건)
1. **`test_cta_linebreak.py::TestFactDbContainsBusinessPage` 실패** — 범위 외 사유: `fact_db.md`에 '사업단 페이지' 표기 미존재 관련 기존 테스트 실패. 본 작업(renderer 대비 수정)과 무관.

⚠️ 기존 테스트 실패 1건 (본 작업 범위 외): `tests/test_cta_linebreak.py::TestFactDbContainsBusinessPage::test_fact_db_contains_business_page`

## QC 자동 검증 결과

- file_check: PASS (4/4)
- data_integrity: PASS
- test_runner: 438 passed, 1건 실패 (본 작업 범위 외 — fact_db.md 관련 기존 테스트)
- tdd_check: PASS
- pyright_check: PASS (0 errors, 0 warnings)
- style_check: PASS (black OK, isort OK)
- 총평: 본 작업 범위 내 테스트 89건 전체 통과
