문서 정리: PHASE-X-B, PHASE-X-PRIME, 메모리 업데이트

현재 상태:
- 유형 A:  동작
- 유형 B: code_assembled만 동작, 파이프라인(filled/after) 미연결
- 핵심 문제: block_assembler가 고정 4역할만 처리 → 유형 B 지원 필요

다음 세션:
1. block_assembler 유형 B 지원
2. 컨테이너 크기 맞춤 (Selenium 측정 기반)
3. 유형 A 깨지지 않는지 확인

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 12:27:47 +09:00
parent 3719704d75
commit 42d60e44a5
2 changed files with 151 additions and 160 deletions

View File

@@ -1,90 +1,111 @@
# Phase X': 유형 B 파이프라인 개선 6건
# Phase X': 유형 B 파이프라인 개선
> 작성일: 2026-04-06
> 최종 업데이트: 2026-04-06
> 전제: 유형 A 건드리지 않음. 유형 B 파이프라인 프로세스 수정.
---
## 현재 상태
- 유형 A: ✅ 동작 (01번 MDX)
- 유형 B: 구조(상단+하단2분할+결론) 동작하나 품질 문제 6건
- 유형 A (배경+본심+첨부+결론): ✅ 동작 (01번 MDX)
- 유형 B (상단+하단2분할+결론): **code_assembled만 동작, 파이프라인(before→filled→after) 미연결**
## 완료된 것
### X'-1: 제목 원본 MDX에서 가져오기 ✅
- `context.normalized.title` 사용 (Kei title 대신)
- 파일: `src/pipeline.py` Stage 1A
### X'-2: 들여쓰기 계층 ✅ (code_assembled에서만)
- `###` 소제목 → 카드형 분리
- 본문 불릿 indent 적용
- 파일: `scripts/assemble_stage2.py`
### X'-3: 이미지 캡션 ✅
- `normalized.images` alt text에서 추출
- 파일: `scripts/assemble_stage2.py`
### X'-4: 상단 균등배분 ✅
- `justify-content:space-between`
- 파일: `scripts/assemble_stage2.py`
### X'-5: 카드 디자인 ✅
- 다크 그라데이션 + 밝은 텍스트
- 파일: `scripts/assemble_stage2.py`
### X'-6: 표 요약 ✅ (code_assembled에서만)
- `normalized.tables` → pipeline V'-2에서 Kei 요약 → context 저장
- `_assemble_type_b` 하단 우측에 표출
- 파일: `src/pipeline.py`, `scripts/assemble_stage2.py`
### MDX sections 계층 ✅
- `mdx_normalizer`: `###` (h3) 소목차도 section으로 분리
- `_assemble_type_b`: `normalized.sections`에서 직접 텍스트 가져오기
- 대목차/소목차 계층 반영
---
## 개선 항목
## 핵심 미해결 문제
### X'-1: 제목 — 원본 MDX에서 가져오기
### 유형 B의 before→filled→after 파이프라인이 연결 안 됨
**문제:** Kei가 슬라이드 제목을 임의로 바꿈
**원인:** KEI_PROMPT가 title을 Kei에게 만들게 함
**수정:** Stage 1A에서 Kei 반환 title 대신 `context.normalized.title` 사용
**파일:** `src/pipeline.py` Stage 1A — 한 줄 수정
**원칙:** MDX frontmatter의 title을 그대로. Kei는 구조만 판단.
**증거:**
- FILLED: 2997bytes, 한글 80자 (유형 A는 214KB)
- `block_assembler.assemble_slide_html()`이 고정 4역할(배경/본심/첨부/결론)만 처리
- 유형 B의 자유 역할명(DX_궁극적_목표, 프로세스_변화 등)을 처리 못 함
- 결과: filled/after가 거의 빈 HTML
### X'-2: 들여쓰기 계층 — 대/중/소제목+본문
**해결 방향:**
- `block_assembler.assemble_slide_html()`이 유형 B 역할도 처리하도록
- 또는 유형 B 전용 filled/after 함수 추가
- `_assemble_type_b`(assemble_stage2)는 code_assembled 전용이므로, 파이프라인의 filled/after에는 별도 로직 필요
**문제:** 모든 텍스트가 왼쪽 맞춤. 계층 구조 없음
**원인:** `_assemble_type_b`에서 `##`, `###`, `•`, ` •` 레벨 구분 없이 처리
**수정:** structured_text에서 `###`=소제목, `•`=본문, ` •`=하위로 인식하여 들여쓰기
```
대제목 (## → 꼭지 제목)
중제목 (### → 카드 소제목)
본문 (• → 불릿)
하위 ( • → 하위 불릿)
```
**파일:** `scripts/assemble_stage2.py``_assemble_type_b` 조립 로직
**원칙:** structured_text의 레벨을 코드가 인식. 하드코딩 아님.
### 렌더링에서 잘림
### X'-3: 이미지 캡션 — 원본 형식 그대로
**증거:**
- code_assembled에 모든 내용이 HTML로 있지만 브라우저에서 보면 잘림
- overflow:hidden + 컨테이너 크기 < 내용 크기
- 상단 카드가 잘림, 결론이 안 보임
**문제:** 캡션이 `DX의 궁극적 목표`로 나옴. 원본은 `[그림 2] DX의 궁극적 목표`
**원인:** `[이미지:]` 마커에서 제목만 추출. 원본 MDX의 `![제목](경로)` 형식 미반영
**수정:** MDX 원본의 이미지 alt text에서 캡션 추출. `![DX의 궁극적 목표](/path)`에서 그대로
**파일:** `scripts/assemble_stage2.py` — 캡션 추출 + `src/mdx_normalizer.py` (이미지 정보에 alt text 보존)
**원칙:** 원본 그대로. 없으면 빈 캡션.
### X'-4: 상단 빈칸 — 컨테이너 내 균등 배분
**문제:** 상단 컨테이너에서 내용이 위로 몰리고 아래 빈칸
**원인:** flex-direction: column + align-items: flex-start
**수정:** 컨테이너 내용이 전체 높이에 균등 배분되도록 flex 속성 조정
**파일:** `scripts/assemble_stage2.py``_assemble_type_b` CSS
**원칙:** font_size/gap 기반 동적 계산. 하드코딩 아님.
### X'-5: 카드 디자인 — 소제목 카드 개선
**문제:** 안전과품질/생산성향상/소통과신뢰 카드가 눈에 안 들어옴
**원인:** 다크배경+노란제목 조합이 가독성 떨어짐
**수정:** PNG 참고 — 각 카테고리별 구분되는 배경색(다크 그라데이션), 불릿 텍스트 밝은 색, 간격 조정
**파일:** `scripts/assemble_stage2.py``_assemble_type_b` 카드 HTML
**원칙:** design tokens + font_size 기반 동적 계산. 색상은 팔레트에서 순환.
### X'-6: 표 요약 — 하단 우측에 Kei 요약 표 배치
**문제:** 2.2 주체별 기대효과에 원본 표(발주자/시공자/설계자) 데이터가 있는데 결과에 빠짐
**원인:** 유형 B에서 V'-2(표 요약) 프로세스가 미연결
**수정:** 유형 A와 동일한 프로세스 — 코드가 하단 우측 공간 계산 → 행/열 수 산출 → Kei에게 원본 표 요약 요청 → 배치
**파일:** `src/pipeline.py` V'-2 + `scripts/assemble_stage2.py``_assemble_type_b` 하단 우측
**원칙:** 공간에 맞게 동적 계산. 원본 표를 Kei가 요약.
**해결 방향:**
- 컨테이너 크기 계산에서 내용 크기를 고려
- 또는 Selenium 측정 후 재배분 (이건 filled→after 파이프라인이 동작해야 가능)
---
## 순서
## Kei가 하는 일 (명확히 정리)
X'-1 → X'-2 → X'-3 → X'-4 → X'-5 → X'-6
1. **꼭지 찾기 + 그루핑** — MDX 구조 분석
2. **유형 선택 (A/B)** — 콘텐츠에 맞는 레이아웃
3. **블록 선택** — 컨테이너에 맞는 블록 타입
4. **공란에 표/팝업 요약** — 원문 최대 유지
5. **bold 키워드 판단** — 문맥 기반
각 단계 완료 후:
- 하드코딩 검사
- 특정 MDX에만 동작하는 코드 아닌지 확인
- 유형 A(01번) 깨지지 않는지 확인
**나머지는 전부 MDX 원본에서 가져옴:**
- 제목, 대목차, 중목차, 소목차, 텍스트 — 원본 그대로
- 핵심 요약 — 원본 그대로
- Kei가 텍스트를 재작성하지 않음
---
## 주의사항
## 다음 세션 작업 순서
- 유형 A 코드 건드리지 않음
- 파이프라인 프로세스를 수정하는 것이지 HTML 결과물을 고치는 것이 아님
- 하드코딩 절대 금지
- 제목/텍스트는 원본 그대로
- Kei가 재구성하는 건 빈 공간 채우기(표 요약)만
1. **유형 B filled/after 파이프라인 연결** — block_assembler 또는 별도 함수
2. **컨테이너 크기 vs 내용 크기 맞춤** — Selenium 측정 기반 재배분
3. **렌더링 잘림 해결** — overflow 처리
4. **01번(유형 A) 깨지지 않는지 확인**
---
## 관련 파일
| 파일 | 역할 | 유형 B 상태 |
|------|------|------------|
| `src/kei_client.py` | KEI_PROMPT (유형 A/B 선택) | ✅ |
| `src/validators.py` | 검증기 (유형 B 완화) | ✅ |
| `src/space_allocator.py` | 컨테이너 생성 (build_containers_type_b) | ✅ |
| `src/pipeline.py` | 파이프라인 분기 (layout_template) | ✅ 분기만 |
| `src/pipeline_context.py` | Analysis.layout_template | ✅ |
| `src/mdx_normalizer.py` | ### 소목차 section 분리 | ✅ |
| `scripts/assemble_stage2.py` | _assemble_type_b (code_assembled) | ✅ |
| `src/block_assembler.py` | assemble_slide_html (filled/after) | ❌ 유형 B 미지원 |