# 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는 독립 작업.
