---
task_id: task-2446
type: context
scope: task
created: 2026-05-04
updated: 2026-05-04
status: completed
---

# 맥락 노트: task-2446

**task**: task-2446 — IDS Phase 0.5 Lite Evaluator 5항목 + JSON Schema

---

## 결정 근거

### 핵심 결정 1: 5항목 정의 (task.md 표면 vs mapping-tables.md SSOT 차이 해소)

**상황**: task.md는 5항목을 다음과 같이 명명:
- L1 Contrast (글리프 픽셀 5th/95th)
- L2 Margin (safe-area-grid 침범)
- L3 Hierarchy (헤딩/본문/캡션 시각 위계 비율)
- L4 Color Token (palette 토큰 일관성, mapping #1 dq-rules 57항목)
- L5 Typography (Pretendard/Noto Sans KR + 자간/행간)

mapping-tables.md 5-A는 다음 5항목:
- L1 Contrast (동일)
- L2 Safe-area 침범 (= task L2)
- L3 Font-size 선언값 (≠ task L3 — 시각 위계 비율은 5-B F2)
- L4 Grid 정렬 (8pt baseline)
- L5 Color palette + AI 퍼플 검출 (≈ task L4)

**결정**: task.md 명명을 외부 라벨로 채택, mapping-tables.md 알고리즘을 내부 구현으로 채택. 1:1 매칭표를 보고서에 명시하여 SSOT 추적성 확보. **이유**: task.md 절대 원칙 "task.md 수정 금지. 봇은 본 payload만 실행" 준수 + "입력 계약 = mapping-tables.md + target-audience.md SSOT 강제" 양립. 두 SSOT 모두 동시 만족하도록 구현 항목을 5개 카테고리에 통합 매핑.

**기각 대안**:
- A안 (mapping-tables.md 단독 채택): task.md L4(Color Token), L5(Typography) 항목 누락 → 회귀 테스트 5/7 시나리오 무효
- B안 (task.md 단독 채택): mapping #5 SSOT 일관성 검증 불가 → 합격조건 B/C FAIL

**채택**: C안 (양 SSOT 통합 매핑) — 5항목 외부 명명 = task.md, 내부 구현 = mapping-tables.md L1~L5 + dq-rules + Pretendard 강제

### 핵심 결정 2: JSON Schema preset enum SSOT 정렬

**상황**: task.md schema 예시 `preset enum=[theme-A, theme-B, theme-C]` ≠ target-audience §7.1 SSOT `[theme-fa-fintech, theme-consumer-warm]`.

**결정**: target-audience §7.1 SSOT 채택. **이유**: SSOT 일관성이 합격조건 C. task.md 예시는 일반화 placeholder로 해석. mappingVersion 강제로 입력 계약 무결성 보장.

### 핵심 결정 3: 외부 의존성 회피 (jsonschema는 사용 가능)

**상황**: PIL/pytesseract/k-means(scikit-learn) 등 무거운 의존성 vs Lite Evaluator 즉시 PASS/FAIL 즉시성.

**결정**:
- **PIL은 사용** (이미 quality_evaluator.py에서 사용 중, 회귀 게이트 환경에서 가용)
- **jsonschema는 사용** (입력 계약 강제 의무)
- **scikit-learn k-means는 사용 안 함** — `scripts/ids/lite_evaluator.py`에 numpy 기반 단순 클러스터링 또는 hue 카운팅으로 대체. 이유: dependency 최소화 + dq-rules 57 토큰 매칭은 hash set 비교로 충분.
- **회귀 테스트는 fixture 기반** (실제 PNG 렌더 X) — Lite Evaluator는 LayoutMeta + PIL Image 직접 입력 받으므로 fixture에서 PIL.Image.new()로 합성 가능.

**이유**: CI 환경 가벼움 + 회귀 테스트 결정성 보장.

## 3 Step Why 자문

- **1st Why — 왜 이 설계가 필요한가?**
  → A: Phase 0 mapping-tables.md SSOT를 코드로 강제하지 않으면 Phase 1 카드뉴스 산출물이 SSOT를 silent 위반할 수 있음. task-2428 회장 평가 "ΔE=0.00이어도 색 대비 안 맞음" 재발 차단을 위해 코드 레벨 게이트가 필수.

- **2nd Why — 왜 A가 최선의 접근인가?**
  → B: Lite Evaluator 5항목 분리는 mapping #4(PIL 회귀 게이트, quantitative)와 #5(design quality, subjective→정적)의 책임 분리를 명확화. JSON Schema 강제로 LayoutMeta 입력 계약 우회 차단. 대안(quality_evaluator.py 직접 확장)은 mapping #4와 #5의 책임 혼재 → 본 task forbidden_paths 위반.

- **3rd Why — 왜 B가 다른 대안보다 나은가?**
  → C: 다른 대안 (1) 통합 evaluator: 책임 혼재 + Phase 0 결정 위반. (2) skill 단계 검증: 환경 의존도 높음, OCR 등 무거움. (3) 휴먼 검증: 결정 일관성 부족 + CI 통합 불가. **본 설계는 환경 비의존 + 정적 분석 + JSON Schema 입력 계약 + 회귀 테스트 결정성**의 4축이 동시 충족되는 유일한 경로.

**A-B-C 일관성 검증**: A(SSOT 코드 강제 필요) → B(5항목 분리 + JSON Schema가 SSOT 강제 메커니즘) → C(다른 대안은 1축 이상 위반)이므로 논리 일관성 PASS.

## 참조 자료

- task.md: `/home/jay/workspace/memory/tasks/task-2446.md`
- Phase 0 mapping-tables: `/home/jay/workspace/memory/plans/ids-phase4-design-system/mapping-tables.md` §5-A L1~L5 (라인 430~620)
- Phase 0 target-audience: `/home/jay/workspace/memory/plans/ids-phase4-design-system/target-audience.md` §7 SSOT (라인 238~337)
- task-2432 보고서: `/home/jay/workspace/memory/reports/task-2432.md`
- quality_evaluator (mapping #4 PIL 회귀): `/home/jay/workspace/scripts/quality_evaluator.py` (forbidden_paths)

## 주의사항

- ★ **forbidden_paths 절대 준수**: `quality_evaluator.py`, `task_scope.py`, `pre_push_guard.py`, `qc_report_guard.py`, `guard.sh`, `anu_confirm_bot/main.py`, `git-hooks/pre-push`, `.github/workflows/ci.yml`, `dispatch.py`, `dashboard/**`, `teams/shared/**`, `CLAUDE.md`, mapping-tables.md, target-audience.md 등 13개 경로/파일/디렉토리. **Edit 직후 git status로 위반 즉시 차단**.
- ★ **봇 자체 머지 금지**: PR 생성까지만. ruleset 8 checks PASS 후 회장 수동 머지.
- ★ **mappingVersion = "v1.0" 고정** (Phase 0 SSOT 시점 기준). 미일치 시 schema validation 단계에서 진입 차단.
- ★ **테스트 결정성**: PIL Image 합성으로 fixture 만들 때 numpy seed 고정. 그라데이션은 픽셀별 명시 색상 지정.
- ★ **L1 알고리즘 핵심**: 글리프 alpha mask 기반 contrast 계산. 단일 픽셀쌍 X — 분포 percentile 검증.
- ★ **본 task PR 절대 admin bypass / direct push 금지**.
