# task-1479.1 완료 보고서

## SCQA

**S**: 배너비교 대시보드에서 DQ 점수가 단일 숫자로 표시되고 있다. v1456은 단일 점수, v1460/v-round2는 task-1475.1에서 최저점(min(1080,1200)) 방식으로 입력됨.

**C**: 1080x1080과 1200x628의 점수가 상이(v1460 cell-1: 1080=82 vs 1200=73, 차이 9점)하나 단일 숫자로는 크기별 품질 차이를 식별할 수 없다. v1456은 채점 기준 자체가 불명확(어느 크기 기준인지 미상).

**Q**: 3개 버전 모두 동일 기준으로 크기별(1080/1200) DQ 점수를 분리 표시할 수 있는가?

**A**: banner-versions.json 구조를 `"cell-id": 90` → `"cell-id": {"1080": 91, "1200": 80}`로 변경. BannerCompareView.js에 크기별 점수 표시 UI 추가(비교뷰: 세로 2줄, 그리드뷰: `82/73` compact). v1456 18개 HTML 분석으로 크기별 재평가 완료. 하위호환(typeof 분기)으로 기존 숫자 형식도 지원.

---

## 작업 내용

### 1. banner-versions.json 구조 변경
단일 숫자 → `{"1080": X, "1200": Y}` 객체로 3개 버전 모두 변환.

### 2. v1456 크기별 재평가 (9셀 x 2사이즈 = 18 HTML 분석)

- cell-1-incar-fair: 1080=91, 1200=80 (1200 headline 74px→DQ-08 감점)
- cell-2-incar-leader: 1080=86, 1200=82 (sub 48px→DQ-08 감점)
- cell-3-incar-support: 1080=91, 1200=85 (support-copy 48px 감점)
- cell-4-ga-fair: 1080=91, 1200=86 (headline 84px 경계)
- cell-5-ga-leader: 1080=88, 1200=79 (subhead 40px→DQ-08 감점)
- cell-6-ga-support: 1080=91, 1200=87 (headline 84px 경계)
- cell-7-snu-fair: 1080=93, 1200=84 (subhead 40px→DQ-08 감점)
- cell-8-snu-leader: 1080=88, 1200=83 (subhead 40px→DQ-08 감점)
- cell-9-snu-support: 1080=90, 1200=82 (subhead 40px→DQ-08 감점)

공통 패턴: 1200 버전에서 서브헤드 40-48px(64px 미달)이 주요 감점 원인. 628px 높이 제약으로 구조적 한계.

### 3. v1460/v-round2 점수 입력
task-1475.1 보고서의 크기별 점수를 그대로 입력 (이미 확보된 데이터).

### 4. BannerCompareView.js UI 수정
- **셀별 비교 뷰**: DQ 영역에 `1080: 82` / `1200: 73` 세로 2줄, 각 줄에 dqColor() 개별 적용
- **9셀 그리드 뷰**: `82/73` compact 형태, 슬래시 구분, 각 숫자별 색상 개별 적용
- **하위호환**: `typeof dqScore === 'object'` / `'number'` 분기로 두 형식 모두 지원
- dqColor() 함수 변경 없음 (각 크기별 점수에 재사용)

---

## 산출물 파일

- `/home/jay/workspace/dashboard/data/banner-versions.json` — 수정 (구조 변경 + v1456 재평가)
- `/home/jay/workspace/dashboard/components/BannerCompareView.js` — 수정 (크기별 UI)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **v1456 크기별 점수 부재** — 18개 HTML CSS 분석으로 직접 평가 수행. 1080은 기존 단일 점수와 유사(±3점), 1200은 평균 7-11점 하락.
2. **하위호환 필요** — typeof 분기로 숫자/객체 형식 모두 처리하도록 구현. 마이그레이션 기간 안전.
3. **그리드 뷰 공간 부족** — compact 형태(`82/73`)로 한 줄에 표시하여 레이아웃 유지.

### 범위 외 미해결 (2건)
1. **v1456 1200 전반적 저점(79-87점)** — 628px 높이 제약으로 서브헤드 축소가 구조적 원인. 디자인팀 영역.
2. **API 서버 매핑 미검증** — `/api/banner-versions` 엔드포인트에서 dq_scores를 cellVersion.dq_score로 변환하는 로직이 서버측에 있을 수 있음. 서버 코드는 이 작업 범위 외.

---

## 검증 결과

- JSON 파싱: python3 json.load 통과
- 3버전 x 9셀 = 27 score entries, 모두 `{"1080": X, "1200": Y}` 객체
- 모든 점수 0-100 범위 내
- JS 문법: 기존 TS 경고(BannerCompareView 미사용) 외 신규 경고 없음

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: banner-versions.json, BannerCompareView.js (2파일). API 서버 매핑 로직은 확인 범위 외.
- [x] 2. 엣지 케이스: typeof 분기로 숫자/객체 모두 처리, null 처리(`?? '—'`), 빈 dq_scores 안전
- [x] 3. 작업 지시와 정확히 일치: 3버전 크기별 분리, 동일 채점 기준, UI 정상 렌더링
- [x] 4. 에러 처리/보안: JSON 구조 검증 통과, XSS 위험 없음(정수만 표시)
- [x] 5. 테스트: python3 JSON 검증(27 entries, 범위, 키 존재), JS typeof 분기 검증
- [x] 6. 발견 이슈 모두 해결: 자체 해결 3건, 범위 외 2건 사유 명시
- [x] 7. 코드 아키텍처: dqColor() 재사용, 분기 로직 최소화
- [x] 8. 인터페이스 변경: dq_scores JSON 스키마 변경 → 하위호환 처리로 기존 소비자 영향 없음
- [x] 9. HTML→PNG: N/A (배너 수정 아님)

---

## 모델 사용 기록

- 팀원: 토르(백엔드) / 작업: v1456 HTML 분석 + banner-versions.json 구조 변경 / 사용 모델: sonnet
- 팀원: 프레이야(프론트엔드) / 작업: BannerCompareView.js 크기별 점수 UI / 사용 모델: sonnet
