# task-322.1 완료 보고서: 렌더러 글박스 내부 여백 불일치 통일

**작업일**: 2026-03-06
**팀**: dev1-team (헤르메스 팀장)
**프로젝트**: ThreadAuto (/home/jay/projects/ThreadAuto/)

---

## 작업 요약

card_list 슬라이드와 detail 슬라이드의 글박스 내부 왼쪽 여백 세팅값이 불일치하던 문제를 해결했습니다. 동일한 UI 패턴(좌측 accent bar + 제목 + description)에서 값이 제각각이던 것을 클래스 상수로 통일하고, 재발 방지 구조를 적용했습니다.

## 수정 전 상태

| 항목 | _draw_info_box (detail) | render_card_list | TIP 박스 |
|------|------------------------|------------------|----------|
| accent bar 두께 | 6px | 5px | 6px (하드코딩) |
| bar→text gap | 16px | 16px | 20px (불일치) |
| text_x_offset | 22px (bar+gap) | 53px (pad+bar+gap) | 26px (bar+20) |

## 수정 후 상태 (통일)

| 항목 | 통일 값 | 적용 위치 |
|------|---------|-----------|
| ACCENT_BAR_WIDTH | 6px | info_box, card_list, TIP |
| ACCENT_BAR_GAP | 16px | 전체 |
| ACCENT_TEXT_X_OFFSET | 22px (6+16) | 전체 |
| CARD_PAD | 32px | info_box, card_list |
| DESC_INDENT | 30px | info_box, card_list |

## 생성/수정 파일 목록

| 파일 | 변경 내용 |
|------|-----------|
| `/home/jay/projects/ThreadAuto/renderer/cardnews.py` | 클래스 상수 5개 추가, _draw_info_box/render_card_list/TIP 박스 상수 참조로 변경, _draw_card_accent_bar 기본값 6 |
| `/home/jay/projects/ThreadAuto/tests/test_padding_consistency.py` | 여백 통일 검증 테스트 60개 추가 |
| `/home/jay/workspace/memory/meetings/2026-03-06-padding-consistency.md` | 에이전트 미팅 기록 |

## 상세 변경 내역

### 1. 클래스 상수 추출 (재발 방지)
```python
class CardNewsRenderer(BaseRenderer):
    MARGIN = 72
    ACCENT_BAR_WIDTH: int = 6
    ACCENT_BAR_GAP: int = 16
    ACCENT_TEXT_X_OFFSET: int = ACCENT_BAR_WIDTH + ACCENT_BAR_GAP  # 22
    CARD_PAD: int = 32
    DESC_INDENT: int = 30
```

### 2. _draw_info_box (detail 슬라이드)
- `bar_w = 6` → `bar_w = self.ACCENT_BAR_WIDTH`
- `text_x_offset = bar_w + 16` → `text_x_offset = self.ACCENT_TEXT_X_OFFSET`
- `pad = 32` → `pad = self.CARD_PAD`
- `desc_indent = 30` → `desc_indent = self.DESC_INDENT`

### 3. render_card_list
- `accent_bar_w = 5` → `accent_bar_w = self.ACCENT_BAR_WIDTH` (5→6)
- `text_x_off = card_pad + accent_bar_w + 16` → `text_x_off = self.ACCENT_TEXT_X_OFFSET` (53→22)
- `card_pad = 32` → `card_pad = self.CARD_PAD`
- `desc_indent = 30` → `desc_indent = self.DESC_INDENT`
- 루프 내 중복 `desc_indent = 30` 제거

### 4. _draw_card_accent_bar
- `bar_width: int = 5` → `bar_width: int = 6`

### 5. TIP 박스 (render_detail 인라인)
- `margin + 6` 하드코딩 → `margin + self.ACCENT_BAR_WIDTH`
- `margin + 6 + 20` (gap 20px) → `margin + tip_bar_w + tip_bar_gap` (gap 16px 통일)
- `tip_content_x = margin + 6 + 20 + tip_label_w + 16` → `tip_content_x = tip_text_x + tip_label_w + tip_bar_gap`

## 전 슬라이드 타입 점검 결과

| 슬라이드 | accent bar 사용 | 변경 여부 | 상태 |
|----------|----------------|-----------|------|
| COVER | 없음 (상단 라인만) | 변경 없음 | OK |
| CARD_LIST | 있음 (5px→6px) | 수정 완료 | OK |
| DETAIL | 있음 (6px 유지) | 상수 참조로 변경 | OK |
| SUMMARY_CTA | 없음 (원형 뱃지) | 변경 없음 | OK |
| BODY | 없음 (원형 뱃지) | 변경 없음 | OK |

## 테스트 결과

**60/60 PASS** (소요 시간: 6.15초)

| 테스트 | 항목 수 | 결과 |
|--------|---------|------|
| 클래스 상수 검증 | 5 | PASS |
| CARD_LIST 이미지 크기 (5테마×3케이스) | 15 | PASS |
| DETAIL 이미지 크기 (5테마×3케이스) | 15 | PASS |
| SUMMARY_CTA 회귀 (5테마) | 5 | PASS |
| BODY 회귀 (5테마) | 5 | PASS |
| 오버플로우/엣지케이스 (5테마×3케이스) | 15 | PASS |

- 이미지 크기: 전체 1080x1350 확인
- 오버플로우: 없음
- pyright: 0 에러 (cardnews.py 기준, WARN 2건은 qc_verify가 프로젝트 루트 밖에서 실행 시 import 경로 문제)

## QC 자동 검증 결과

```json
{
  "task_id": "task-322.1",
  "checks": {
    "file_check": "PASS",
    "data_integrity": "PASS",
    "pyright_check": "WARN (import 경로 — 프로젝트 내부 run_pyright.sh로는 0 에러)",
    "style_check": "PASS (black + isort)",
    "scope_check": "SKIP",
    "schema_contract": "SKIP (workers 변경 없음)",
    "api_health": "SKIP (서버 작업 아님)",
    "test_runner": "SKIP"
  }
}
```

## pyright WARN 설명
- `renderer.engine`, `renderer.themes` import 해석 불가 — qc_verify.py가 프로젝트 루트(/home/jay/projects/ThreadAuto/) 밖에서 pyright를 실행하기 때문. `bash /home/jay/workspace/teams/shared/run_pyright.sh renderer/cardnews.py` (프로젝트 내부)에서는 0 에러 확인.

## 버그 유무
- 발견된 버그 없음

## 비고
- 에이전트 미팅 기록: `/home/jay/workspace/memory/meetings/2026-03-06-padding-consistency.md`
- SUMMARY_CTA(card_pad=28)와 BODY(card_pad=40)는 accent bar를 사용하지 않는 별도 레이아웃이므로 통일 대상에서 제외 (미팅 합의)
