# Phase T 잔여 작업 — 프롬프트 동적 생성 + 미반영 사항 > 작성일: 2026-04-02 > 상태: Phase T 구조(Stage 0~5)는 완성. 하지만 핵심인 프롬프트가 Phase S 하드코딩 그대로. > 이 문서: 프롬프트 교체 + 미반영 사항 전체 리스트 + 실행 계획. --- ## 1. 전체 문제 리스트 ### 1-1. 프롬프트 하드코딩 (근본 문제) html_generator.py의 BG_PROMPT, CORE_PROMPT, SIDEBAR_PROMPT, FOOTER_PROMPT 4개가 Phase S 때 만든 고정 CSS 값(9px, 10px, #f8fafc, padding:14px 등)으로 박혀있음. Phase T에서 계산한 폰트 위계, 디자인 예산, 블록 레퍼런스가 결과에 반영되지 않는 근본 원인. ### 1-2. 폰트 크기 위계 미반영 Phase T Stage 1.5a에서 계산: 핵심=14px, 본심=12px, 배경=11px, 첨부=10px. 하지만 프롬프트가 배경=9px, 첨부=10px 등 다른 값을 하드코딩. → 프롬프트가 Phase T 위계 값을 사용해야 함. ### 1-3. 배경-본심 가로 길이 불일치 sidebar-right 구조에서 배경과 본심은 같은 body zone에 있으므로 가로 폭이 동일해야 함. 현재 프롬프트가 각각 다른 width를 지정할 수 있어서 Sonnet이 다르게 생성. → "body 영역 전체 폭 100%" 강제. ### 1-4. 들여쓰기 불일치 불릿(•) 첫째줄 텍스트 시작점과 둘째줄 시작점이 정확히 일직선이어야 함. 글씨 크기가 영역마다 다르므로(배경 11px, 본심 12px, 첨부 10px) 들여쓰기 px도 각 폰트에 맞게. padding-left와 text-indent를 폰트 크기 기준으로 계산. 계산 방식: - 불릿 마커 "• " 폭 ≈ font_size × 1.2 (한글 기준) - padding-left = ceil(font_size × 1.2) - text-indent = -padding-left | 영역 | 폰트 | padding-left | text-indent | |------|------|-------------|-------------| | 배경 (11px) | 11px | 14px | -14px | | 본심 (12px) | 12px | 15px | -15px | | 첨부 (10px) | 10px | 12px | -12px | ### 1-5. 블록 선택 → 컨테이너 맞춤 재구성 미반영 Phase T의 핵심 목적: - Stage 1.7에서 relation_type + expression_hint → 참고 블록 선택 - 선택된 블록의 구조(색상, 레이아웃, 패턴)를 따르되 컨테이너 크기에 맞게 재구성 - AI가 "발명"하지 않고 검증된 블록 구조를 따르게 현재: Stage 1.7이 블록을 선택하고 레퍼런스 HTML을 생성하지만, 프롬프트가 이것을 무시하고 하드코딩 CSS를 따름. → 프롬프트가 레퍼런스 HTML을 "따르라"고 지시해야 함. ### 1-6. 팝업(상세 내용) 별도 HTML 분리 본문에 다 넣을 수 없는 상세 내용(DX-BIM 비교표 12행 등)은: 1. final.html에는 "상세보기" 링크만 2. 상세 내용은 별도 첨부 HTML 파일로 생성 출력 구조: ``` data/runs/{run_id}/ ├── final.html ← 슬라이드 본문 ├── 첨부1_DX_BIM_비교표.html ← details에서 분리된 상세 ├── 첨부2_xxx.html ← 필요 시 추가 └── ... ``` ### 1-7. 동일 내용 중복 금지 같은 내용이 본문에 2번 나오면 안 됨. 예: "DX와 BIM 비교표 보기" 링크 + 본문에 비교표 전체 → 중복. 비교표는 첨부 HTML로 분리하고, 본문에는 링크만. --- ## 2. 수정 완료 항목 (이미 처리됨) | # | 항목 | 파일 | 상태 | |---|------|------|------| | A | 동적 비율 72:28 grid 반영 | renderer.py | ✅ 완료 | | B | body-footer 공란 제거 | renderer.py | ✅ 완료 | | C | L4 overflow 시 재생성 트리거 | pipeline.py | ✅ 완료 | --- ## 3. 실행 계획 ### Step R-1: 프롬프트 동적 생성 함수 (1-1, 1-2, 1-3, 1-4, 1-5, 1-7 해결) **파일:** html_generator.py 하드코딩 BG_PROMPT/CORE_PROMPT/SIDEBAR_PROMPT/FOOTER_PROMPT를 삭제하고, `build_area_prompt(role, context)` 함수로 교체. 이 함수가 context에서 가져오는 것: - font_size ← context.font_hierarchy (1-2) - width ← context.containers[role].width_px (1-3) - height ← context.containers[role].height_px - indent_px ← font_size 기반 계산 (1-4) - reference_html ← context.references[role].design_reference_html (1-5) - design_budget ← context.containers[role].design_budget - "중복 금지" 규칙 (1-7) ### Step R-2: 팝업 별도 HTML 생성 (1-6 해결) **파일:** pipeline.py (Stage 5), html_generator.py Stage 0에서 추출된 popups[]를 별도 HTML 파일로 생성. final.html에는 "상세보기" 링크만 남기고, 상세 내용은 첨부N_제목.html로 저장. ### Step R-3: 검증 + 시뮬레이션 **파일:** scripts/test_phase_t_audit.py 확장 - 프롬프트에 하드코딩 px 값이 없는지 검사 - font_hierarchy 값이 프롬프트에 반영되는지 확인 - 들여쓰기 CSS가 폰트 크기 기반인지 확인 - 레퍼런스 HTML이 프롬프트에 포함되는지 확인 - 팝업 별도 HTML 생성 확인 - 실제 데이터로 전체 시뮬레이션 --- ## 4. 실행 순서 ``` Step R-1 (프롬프트 동적 생성) → Step R-3 (검증) Step R-2 (팝업 분리) → Step R-3 (검증) ``` R-1이 가장 크고 핵심. R-2는 독립 작업.