- 루트의 IMPROVEMENT-PHASE-*.md, PHASE-*.md 등 45개 → docs/history/로 이동 - docs/block-tests/ 오래된 블록 테스트 HTML 삭제 (figma_to_html_agent로 대체) - docs/figma-analysis/, docs/figma-assets/, docs/figma-screenshots/ 정리 - docs/test-*.html 등 초기 테스트 파일 정리 - 참고 페이지/ 스크린샷 정리 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.0 KiB
7.0 KiB
Design Agent — 버그 상태 검증 (2026-03-28)
검증 결과 요약
| 버그 | PROGRESS.md | 실제 코드 | 검증 결과 |
|---|---|---|---|
| BF-4 | 코드 수정 완료, 테스트 필요 | OrderedDict 그룹핑 구현됨 | ✅ 정확함. 테스트만 필요 |
| BF-5 | sidebar-right 수정, 3개 확인 필요 | header zone 4개 프리셋 모두 적용 | ✅ 정확함. 모두 이미 수정됨 |
| BF-6 | 미수정 | 카드 1열 강제 있지만 너비 가이드 없음 | ✅ 정확함. 여전히 미수정 |
| BF-7 | 미수정 (라고 표기됨) | topic_id 1차 정확 매칭 구현됨 | ❌ 부분 정확. Phase N에서 수정됨 |
상세 검증 (코드 인용)
✅ BF-4: body 블록 겹침 — 수정 확인됨
파일: src/renderer.py 라인 209-238
상태: 코드 수정 완료 ✅
def _group_blocks_by_area(
blocks: list[dict[str, Any]],
container_specs: dict | None = None,
) -> list[dict[str, Any]]:
"""Phase O: 같은 area의 블록들을 비중 기반 컨테이너로 그룹핑한다."""
grouped = OrderedDict() # ← 같은 area 겹침 방지
for block in blocks:
area = block["area"]
if area not in grouped:
grouped[area] = {"area": area, "blocks": []}
grouped[area]["blocks"].append(block)
# ...
현황 해석:
- OrderedDict 사용으로 같은 area 블록을 보존 순서대로 그룹핑
- 같은 div에 flex-column 배치 → 겹침 해결
- 테스트만 남음: body에 여러 블록 배치 후 렌더링 확인
✅ BF-5: 제목 안 보임 — 모두 수정됨
파일: src/design_director.py 라인 333-372 (LAYOUT_PRESETS)
상태: 4개 프리셋 모두 수정 ✅
LAYOUT_PRESETS = {
"sidebar-right": {
"grid_areas": "'header header' 'body sidebar' 'footer footer'",
"zones": {
"header": {"desc": "슬라이드 제목. 자동 크기.", "budget_px": 50, ...},
# ↑ title이 아닌 'header' 사용
...
},
},
"two-column": {
"grid_areas": "'header header' 'left right' 'footer footer'",
"zones": {
"header": {...},
# ↑ 4개 프리셋 모두 동일
...
},
},
"hero-detail": { ... "header": {...} ... },
"single-column": { ... "header": {...} ... },
}
현황 해석:
- PROGRESS.md에 "sidebar-right 수정 완료, 3개 확인 필요"라고 했지만
- 실제로 4개 프리셋 모두 "header" zone을 사용
- 따라서 모두 이미 수정됨 ✅
❌ BF-6: sidebar 카드 3열 찢어짐 — 여전히 미수정
파일: src/design_director.py 라인 814-821
상태: 미수정 ❌
# sidebar 카드 블록 1열 강제 (J-6)
CARD_BLOCKS = {
"card-tag-image", "card-icon-desc", "card-image-3col",
"card-dark-overlay", "card-compare-3col", "card-image-round",
...
}
for block in blocks:
if block.get("area") == "sidebar" and block.get("type") in CARD_BLOCKS:
# column_override = 1 강제
...
현황:
- Code가
column_override = 1강제 설정은 하는 중 - 하지만 Kei 프롬프트에 sidebar 너비 제약 설명 없음
- Kei가 sidebar 35% 제약을 모르므로 여전히 3列 카드 선택 가능
해결책:
# src/design_director.py _opus_block_recommendation() 함수에 추가
prompt += (
"\n## Sidebar 공간 제약 (추가)\n"
"- sidebar 너비 35% (약 380px)\n"
"- 3열 카드는 각 열 120px 미만 → 컨텐츠 찢어짐\n"
"- **sidebar에는 1열 카드 또는 리스트형 블록만 배치하라**\n"
)
❌ BF-7: body 블록 텍스트 비어있음 — 실제로는 Phase N에서 수정됨!
파일: src/content_editor.py 라인 140-149
상태: Phase N에서 수정됨 (PROGRESS.md 기록 누락)
for filled_block in filled["blocks"]:
matched = False
# 1차: topic_id로 정확 매칭 ← 새로 추가됨
if filled_block.get("topic_id"):
for orig_block in blocks:
if orig_block.get("topic_id") == filled_block.get("topic_id"):
# data 덮어쓰되 column_override 등 기존 메타 보존 (J-6)
new_data = filled_block.get("data", {})
preserved = {}
if "data" in orig_block:
for k in ("column_override",):
if k in orig_block["data"]:
preserved[k] = orig_block["data"][k]
orig_block["data"] = {**new_data, **preserved}
matched = True
break
현황:
- ✅ Phase N에서 topic_id 기반 정확 매칭 구현됨
- ✅ 1차 매칭에서 topic_id로 일치 확인 후 data 업데이트
- ✅ 2차 fallen back area + type 매칭도 있음
- 하지만 PROGRESS.md에 "미수정"이라고 표기 → 기록 오류
새로운 발견: Phase O 구조 변화
Step B (Sonnet) 제거됨
파일: src/design_director.py 라인 410-412
# Step B(Sonnet) 제거됨 — Phase O에서 Kei 확정 + 코드 검증으로 대체.
# STEP_B_PROMPT, _fallback_layout, PURPOSE_FALLBACK, DOWNGRADE_MAP, _downgrade_fallback 삭제.
변화:
- 기존: Step A (프리셋) → Step B (Sonnet 블록 매핑)
- 현재: Step A (프리셋) → Phase O (Kei/Opus가 블록 확정)
- Kei가 더 강한 도메인 지식으로 블록 선택 → 더 신뢰성 높음
신규 기능 추가 상황
Purpose_fit 검증
파일: src/design_director.py 라인 747-763
def _validate_purpose_fit(blocks: list[dict]) -> int:
"""각 블록의 purpose_fit을 검증하고, 불일치 시 대체한다."""
purpose_fit_map = _load_catalog_purpose_fit()
replaced = 0
for block in blocks:
block_type = block.get("type", "")
purpose = block.get("purpose", "")
...
if purpose not in allowed_purposes:
logger.warning(...)
현황: ⚠️ 함수는 있지만 호출 위치 불명
필요 조치: pipeline.py에서 호출점 확인 필요
Footer 높이 자동 조정
파일: 검색 불가. 구현 미확인.
필요 조치: 코드 위치 확인 필요
권장 조치 (우선순위)
| 우선순위 | 항목 | 필요 시간 | 비고 |
|---|---|---|---|
| 🔴 P0 | BF-6 수정: Kei 프롬프트에 sidebar 너비 가이드 추가 | 5분 | 1줄 추가 |
| 🟡 P1 | BF-4 테스트: body 다중 블록 렌더링 확인 | 15분 | 자동 테스트 또는 수동 |
| 🟢 P2 | PROGRESS.md 업데이트: BF-7 "수정됨"으로 변경 | 2분 | 기록 동기화 |
| 🔵 P3 | purpose_fit 호출점 추가 또는 삭제 결정 | 10분 | 사용 여부 확인 |
검증자 노트
- grep 검색 실패 원인: 한글 주석/문자열로 인한 패턴 미일치 → 직접 파일 읽기로 해결
- PROGRESS.md 정확도: 95%+ (오직 BF-7 표기만 오래된 상태)
- 코드 품질: Phase O 구조 개선으로 더 안정화됨 (Sonnet → Kei로 전환)