Files
C.E.L_Slide_test2/BUG_STATUS_VERIFICATION.md
kyeongmin b0bcffc0f6 Phase N+O: 컨테이너 기반 레이아웃 + Step B 제거 + 전면 정리
- Phase N: catalog 개선, fallback 전면 제거, Kei API 무한 재시도, topic_id 버그 수정
- Phase O: 컨테이너 스펙 계산(비중→px), 블록 스펙 확정, 렌더러 container div
- Step B(Sonnet) 제거: Kei(A-2)+코드로 대체. STEP_B_PROMPT/fallback/DOWNGRADE_MAP 삭제
- Selenium: container div 감지 추가
- catalog.yaml: ref_chars 구조 변환 + FAISS 재빌드
- 문서 전면 갱신: README, PROGRESS, IMPROVEMENT, Phase I~O md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 15:20:51 +09:00

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에서 호출점 확인 필요

파일: 검색 불가. 구현 미확인.
필요 조치: 코드 위치 확인 필요


권장 조치 (우선순위)

우선순위 항목 필요 시간 비고
🔴 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로 전환)