ec83405770dc73d0dc785cdc45388ddf2241bf80
사용자 lock 2026-05-08 — Step 5/6/9 boundary reframe.
V4 가 frame 선택, Step 6 은 V4 rank-1 default 전사, Step 9 는 application_plan
번역. compat 매트릭스 안 폐기.
src/phase_z2_pipeline.py 변경 :
- lookup_v4_candidates(v4, section_id, max_n=6) 추가 — V4 non-reject max-6
후보 list. raw 32 entry 는 v4_full32_result.yaml 영속, step05 = 정제 list.
lookup_v4_match() (rank-1) 유지 — Step 6 backward compat. (Step 5 보완)
- step05_v4_evidence.json schema 확장 — evidence_per_section[i] =
{section_id, v4_candidates: [...], candidate_status: "ok" |
"no_non_reject_v4_candidate"}. (Step 5 보완)
- candidates_lookup_fn 정의 + plan_composition() 에 주입.
V4 raw dict 는 composition module 안 봄 — fn injection. (Step 6-A)
- Step 6 artifact 의 selected_units[i] 에 v4_candidates 필드 추가. (Step 6-A)
- step07_layout.json data 에 unit_count + layout_candidates 필드 추가
(Step 7-B 의 select_layout_candidates 결과). step07_selected_layout.html
에 Layout Candidates 섹션 추가 (default / alternative / selected badge).
(Step 7-conn)
- step08_zone_region_ratios.json 의 per_zone_plan[i] 에 region_layout_candidates
+ display_strategy_candidates 필드 추가 (Step 8-B-1/2 후보 함수 호출).
step8_conn_placeholder_signals 명시 — Step 3/4 부재 종속 placeholder
(region_count=1, content_type="text_block"). step08 HTML 에 candidates pill +
placeholder caveat. (Step 8-conn)
- APPLICATION_MODE_BY_V4_LABEL 상수 추가 — V4 label → application_mode 변환.
- Step 9 v0 artifact block 신설 (~180 줄) — step09_application_plan.json +
.html. unit 별 layout_candidates / region_layout_candidates /
display_strategy_candidates / v4_candidates / candidate_status /
application_status / current_default_candidate / application_candidates 박힘.
invariant 5 가지 자연 만족 (status.md §4). (Step 9 v0)
src/phase_z2_composition.py 변경 :
- CompositionUnit 에 v4_candidates: list field 추가 (additive, logic 무변).
duck typed (V4Match-shape) — circular import 회피. (Step 6-A)
- collect_candidates() 에 v4_candidates_lookup_fn 인자 추가. 3 분기
(single / parent_merged / parent_merged_inferred) 에서 v4_candidates 채움.
(Step 6-A)
- plan_composition() 도 v4_candidates_lookup_fn pass-through. (Step 6-A)
- stale "pipeline 호출처 X" 주석 정정 (3 곳: select_layout_candidates /
select_region_layout_candidates / select_display_strategy_candidates +
catalog header 2 곳). Step 7-conn / 8-conn 으로 호출처 박혀 *호출처 X* 사실
위배. (cleanup-1)
axis 닫힘 : Step 5 보완 + 6-A + 7-conn + 8-conn + Step 9 v0 + cleanup-1.
폐기 : 6-B (frame ownership transfer — misframed axis. PHASE-Z-CHANGE-LOG.md
2026-05-08 #2 entry 참조).
regression 0 : MDX03 fresh run 검증 — final.html / step10/12/13/20 byte-동일.
schema 확장만 (step05/06/07/08/09).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C.E.L. Slide Pipeline
이 프로젝트는 무엇인가
MDX 기반 콘텐츠를 입력하면, 1280×720 슬라이드 HTML로 자동 변환하는 파이프라인입니다.
텍스트 콘텐츠를 넣으면, 구조를 분석하고 BEPs(Figma) 디자인을 매칭하여 슬라이드를 만들어줍니다.
어떻게 구성/구현되어 있는가
전체 흐름
MDX 입력 → 정규화 → 꼭지 추출(AI) → zone 구분 → BEPs 매칭 → 조립 → 검증 → 출력
구조
- slide-base: 1280×720 슬라이드 프레임. 대목차 + 구분선 + 본문 영역 + 핵심 인사이트(footer)
- zone: 본문 영역 안에서 중목차(##) 기준으로 나뉘는 영역 (top/bottom 등)
- 블록: zone 안에 들어가는 디자인 단위. Figma에서 추출한 BEPs 디자인을 HTML/CSS로 변환한 것
- catalog: 블록의 메타 정보 (구조, 슬롯, 매칭 조건)
주요 파일
| 파일 | 역할 |
|---|---|
src/pipeline.py |
파이프라인 오케스트레이션 |
src/section_parser.py |
중목차 추출, 구조 분류 |
src/block_reference.py |
BEPs 디자인 매칭 |
src/block_assembler.py |
슬라이드 HTML 조립 |
templates/blocks/slide-base.html |
슬라이드 프레임 |
templates/catalog.yaml |
블록 메타 정보 |
산출물
각 실행은 data/runs/{run_id}/ 아래에 저장됩니다.
| 파일 | 내용 |
|---|---|
final.html |
최종 슬라이드 |
final_context.json |
파이프라인 결과 데이터 |
steps/*.html |
단계별 디버그 보드 |
첨부*_상세*.html |
popup 상세 내용 |
무슨 문제가 있는가
| 문제 | 설명 |
|---|---|
| 블록마다 스타일이 제각각 | 각 블록 HTML 안에 font-size, color, padding이 직접 박혀있어서, 같은 슬라이드 안에서 블록이 섞이면 위계가 안 맞음 |
| slide-base에 구조+스타일 혼재 | 프레임 HTML 안에 전체 CSS가 인라인으로 들어있어서 유지보수가 어려움 |
| 블록이 완성 HTML | 블록이 구조+스타일+값을 모두 포함하고 있어서, 재사용/조합이 안 됨 |
| 매칭 안 되면 고정 렌더 | BEPs에 맞는 블록이 없을 때 코드가 1회 고정 렌더하고 끝. 반복 조정 없음 |
| 빈 공간/overflow 방치 | 렌더 후 빈 공간이 있어도 조정 안 하고, overflow만 감지 |
| 검증이 약함 | overflow 측정만 하고, 정렬/위계/가독성 같은 시각 품질은 미검증 |
어떻게 개선하려 하는가
핵심은 3가지입니다.
- 블록을 구조 부품화 — 완성 HTML이 아니라, 구조만 담고 스타일은 토큰으로 분리
- 스타일을 토큰으로 통일 — 블록마다 제각각인 폰트/색/여백을 공통 기준으로
- 2경로 파이프라인 — 매칭되면 바로 쓰고(direct-fit), 안 되면 재구성(recipe)
AS-IS → TO-BE
AS-IS:
AI가 먼저 꼭지를 추출하고
→ 매칭 블록이 있으면 삽입, 없으면 코드가 1회 고정 렌더
→ 빈 공간이 있어도 그냥 둠
→ 블록마다 font-size, color가 직접 박혀있어서 섞이면 위계 안 맞음
TO-BE:
중목차 기준으로 zone을 먼저 나누고
→ TF-IDF로 BEPs 매칭 시도
→ 매칭되면 블록 삽입 + 크기 조절 (direct-fit)
→ 안 되면 AI가 꼭지 정리 + 유사 디자인으로 redesign + 반복 조정 (recipe)
→ 빈 공간/overflow를 자동 재분배
→ 모든 블록이 토큰 기반이라 스타일 통일
현재 상태
| 대상 | 슬라이드 변환 | 파이프라인 자동화 |
|---|---|---|
| MDX 03 (3개 목표 + 비교표) | ✅ 완료 | ✅ 파이프라인 연결 |
| MDX 02 (목표 + 프로세스 + 상세표) | ✅ 완료 | △ 파이프라인 연결, 시각 품질 개선 중 |
| MDX 01 (Type A, sidebar 구조) | ✅ 완료 (개별) | 미연결 |
| 토큰 기반 CSS 체계 | - | ✅ 정의 완료, slide-base 적용 |
| Figma 블록 추출 | - | 진행 중 (figma_to_html_agent/blocks/) |
다음 단계 방향
| 순서 | 단계 | 내용 |
|---|---|---|
| 1 | 폴더 구조 정리 | structures/recipes/legacy 분리 |
| 2 | 기존 블록 점진 전환 | 분류(direct-fit/recipe/rewrite) → 토큰 기반 전환 |
| 3 | catalog 고도화 | 파일명 중심 → 속성 테이블 기반 매칭 |
| 4 | 파이프라인 연결 | TF-IDF 매칭 + recipe/composition 경로 |
| 5 | fit 루프 확장 | 빈 공간 재분배, preview 축약, 자동 조정 반복 |
| 6 | 시각 품질 검증 | 정렬, 위계, 가독성 검증 강화 |
참고 문서
| 문서 | 내용 |
|---|---|
| IMPROVEMENT-PLAN.md | 개선 설계 (목표/방향/6단계 계획) |
| TOKENS-v1.md | 토큰 위계 기준표 초안 |
| BLOCK-RULES.md | 블록 작성 규칙 (에이전트 간 계약서) |
Description
Languages
Python
86.6%
HTML
12.7%
CSS
0.7%