Files
C.E.L_Slide_test2/docs/architecture/PHASE-Z-CATALOG-RUNTIME-DESIGN.md
kyeongmin e7848b602d Add Phase Z runtime foundation
- add visual fit classifier, router, retry, and failure routing modules
- add composition planner and catalog-driven mapper
- add Phase Z pipeline orchestration and architecture docs
2026-05-04 08:21:28 +09:00

1399 lines
76 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase Z Catalog / Runtime Design
> **본 문서는 Phase Z-1 사전 작업의 마지막 설계 산출물이며, Phase Z-2 본격 구현 (catalog / runtime / matching 통합) 의 입력 문서다.**
>
> ⚠️ 본 문서는 **1 차 — skeleton + 책임 영역 정의**. 각 영역은 "무엇을 결정하는가 / 무엇을 결정하지 않는가" 까지만. 세부 설계는 단계적 추가.
> ⚠️ 본 문서 = **설계 책임 정리**. 코드 / 파일 변경 / 기존 자산 삭제 X.
---
## 1. 문서 위치 / 목적
본 문서는 design_agent 의 Phase Z 흐름에서 **catalog (frame ↔ Zone 매핑) + runtime (Jinja2 template + AI 경계) 의 책임 분리** 를 정의한다.
**위치 (Phase Z-1 사전 작업 산출물 흐름)** :
1. [`FRAME-INTEGRATION-MAP.md`](FRAME-INTEGRATION-MAP.md) — 32 frame Zone 적용 분류
2. [`PHASE-Z-FRAME-STYLE-INVENTORY.md`](PHASE-Z-FRAME-STYLE-INVENTORY.md) — 32 frame + 18 token + 6 legacy
3. **본 문서** — 위 두 인벤토리 + IMPROVEMENT-REDESIGN.md 5 단계 흐름 → catalog / runtime 책임 정리
→ Phase Z-2 본격 구현의 *입력 문서*. 본 문서는 코드 / 파일 변경을 *지시하지 않음*.
**목적** :
- frame inventory + style inventory 가 catalog 어디에서 책임지는지 정의
- AI 가 *건드리지 않는* 영역 명시 (Phase R' 회귀 방지)
- 코드 구현 시 어떤 책임이 어디 살아야 하는지 사전 합의
---
## 2. 입력 문서
| 문서 | 본 설계가 받는 입력 |
|---|---|
| [`IMPROVEMENT-REDESIGN.md`](../../IMPROVEMENT-REDESIGN.md) | Phase Z 5 단계 흐름, 위계 + 용어, 절대 룰 (텍스트 무손실 / MDX 1 = 슬라이드 1 / 자유 디자인 금지 / 불일치 시 레이아웃 회귀) |
| [`FRAME-INTEGRATION-MAP.md`](FRAME-INTEGRATION-MAP.md) | 32 frame Zone 적용 분류 (`zone_direct` / `zone_adapt` / `zone_extract` / `reference_only`), 검토 상태, 분포 |
| [`PHASE-Z-FRAME-STYLE-INVENTORY.md`](PHASE-Z-FRAME-STYLE-INVENTORY.md) | Frame Inventory 32 행 (변환 14 + 미변환 18) + Token Inventory 18 행 (covered / gap_candidate / hierarchy_mapping_only / hold_recheck_after_conversion) + Legacy Reference 6 행 |
---
## 3. 핵심 원칙 (Phase Z 준수)
| 원칙 | 의미 |
|---|---|
| **final unit = Zone** | 슬라이드의 최종 조립 단위는 Zone. frame 은 절대 슬라이드에 직접 안 꽂힘 |
| **frame = reference / pattern / slot hint** | frame 은 디자인 레퍼런스 / 구조 패턴 / 슬롯 힌트만. 원본 그대로 사용 X |
| **AI = zone content only** | AI 호출은 zone 안 콘텐츠 매핑 / 텍스트 다듬기 / 디자인 변형 단위로만 |
| **HTML / Jinja2 = code only** | HTML 구조 / 레이아웃 / 프리셋 결정 / 새 frame 결정은 코드만 (AI 호출 X) |
| **legacy blocks runtime reuse X** | 기존 `templates/blocks/structures/` 6 파일은 runtime 재사용 후보 X. 스타일 / 토큰 매핑 참고만 |
---
## 4. 책임 영역 (8 영역)
각 영역의 **무엇을 결정하는가 / 무엇을 결정하지 않는가** 만 본 1 차에서 정의. 세부 설계는 다음 차수.
### 4.1 Zone Catalog
**결정함** :
- frame ↔ Zone 매핑 룰 (어느 frame 이 어느 Zone 에 들어갈 수 있는가)
- 레이아웃 프리셋 (Type A / B / B' / B'') 별 Zone 구성
- 매칭 분기 (완벽 / 어정쩡 / 안 됨) 의 Zone 단위 의사결정
- `zone_application` (`zone_direct/adapt/extract/reference_only`) 의 catalog 안 표현
**결정 안 함** :
- 실제 frame 의 시각 스타일 (→ 4.2 Family CSS)
- HTML 구조 (→ 4.3 Jinja2 Runtime Templates)
- AI 호출 시점 / 입력 (→ 4.4 AI Boundary)
### 4.2 Family CSS
**결정함** :
- frame family 별 시각 / 스타일 규칙 정의
- 후보 family (Frame Inventory 의 Phase Z Target 컬럼 기반) : `compare-paired.css` / `compare-table.css` / `pill-list.css` / `three-pillar.css` / `persona-cards.css` / `quadrant.css` / `split-panel.css` / `split-center.css`
- variant 분기 (예 : `compare-paired.css``paired-rows` vs `vs-center-badge`)
- token (color / gradient) 사용 + 신규 token 후보 흡수 / 기각
**결정 안 함** :
- HTML 마크업 자체 (→ 4.3)
- frame ↔ Zone 매핑 (→ 4.1)
- 텍스트 콘텐츠 (→ 4.4)
### 4.3 Jinja2 Runtime Templates
**결정함** :
- HTML 구조 (slide-base + body + zone slot + frame slot 의 마크업 골격)
- 슬롯 의미 매핑 (frame slot ↔ MDX 콘텐츠)
- 검증 (overflow / 시각 품질) hook 위치
- 본문 preview ↔ 팝업 원문 분리 위치 (텍스트 무손실 보존)
**결정 안 함** :
- 시각 스타일 (→ 4.2)
- frame 선택 (→ 4.1)
- AI 호출 (→ 4.4)
### 4.4 AI Boundary
**결정함** :
- AI 호출 **허용** 범위 — zone 안 콘텐츠 매핑 / 텍스트 다듬기 / 슬롯 의미 미세 조정
- AI 호출 **금지** 범위 — HTML 구조 / 레이아웃 / 프리셋 결정 / 새 frame 결정 (Phase R' 회귀 방지)
- AI 입력 / 출력 형식 (zone 단위 컨텍스트만, 슬라이드 전체 X)
**결정 안 함** :
- AI 모델 / 프롬프트 자체 (구현 단계)
- AI 호출 횟수 / 캐싱 (구현 단계)
### 4.5 Token Resolution
**결정함** :
- frame raw px (figma 1280 폭 기준) ↔ slide-body 스케일 (1200×590) 매핑 룰
- `hierarchy_mapping_only` 행 (Token Inventory) 이 catalog 어디에서 적용되는가
- 신규 token (`gap_candidate`) 채택 / 기각 의사결정 위치
- `hold_recheck_after_conversion` token 의 재검증 시점
**결정 안 함** :
- token 값 자체 (→ Style Inventory 영역)
- token 파일 생성 / 변경 (구현 단계, 사용자 승인 후)
### 4.6 Asset Policy
**결정함** :
- 자산 의존도 큰 frame (F01 9 자산 / F07 16 자산 / F14 사진 / F22 15 자산 등) 의 처리 정책
- placeholder / 사용자 제공 / SVG 변환 / 이미지 유지 분기 룰
- `reference_only` frame (F06) 의 자산 정책 (직접 적용 X)
**결정 안 함** :
- 실제 자산 파일 / 경로 (구현 단계)
- placeholder 의 시각 디자인 (구현 단계)
### 4.7 Variant Model
**결정함** :
- family 안 variant 의 표현 방식 후보 (CSS class modifier / data attribute / template parameter 등)
- variant ↔ frame 매핑 룰 (`compare-paired.css``paired-rows` ↔ Frame 17 / `vs-center-badge` ↔ Frame 18 등)
- variant 충돌 시 의사결정 (예 : 같은 zone 에 두 variant 가능 시)
**결정 안 함** :
- 구체 CSS 구현 (→ 4.2)
- variant 추가 / 폐기 (구현 단계)
### 4.8 Fallback Behavior
**결정함** :
- 5 차 Fallback (코드 → AI 콘텐츠 조정 → 단일 프리셋 강제) 의 catalog 단위 책임
- 매칭 실패 시 zone 단위 동작
- AI 콘텐츠 조정 (4 차) 의 입력 / 출력 경계 (frame / zone / container 유지, 콘텐츠만 조정)
- 레이아웃 회귀 (불일치 시 그릇 변경) 의 catalog 단위 트리거
**결정 안 함** :
- AI 호출 자체 (→ 4.4)
- HTML 재구성 (→ 4.3)
---
## 5. 비범위
본 문서는 **설계 책임 정의** 만. 다음은 본 문서 비범위 :
- ❌ 코드 구현 (Phase Z-2 이후)
- ❌ 기존 `templates/blocks/` 삭제 (사용자 승인 후 별도 단계)
-`templates/styles/frame-patterns/` 신규 파일 생성 (사용자 승인 후)
-`templates/styles/tokens/``gap_candidate` token 추가 (사용자 승인 후)
- ❌ legacy structures 6 파일 삭제 (사용자 승인 후)
- ❌ AI 모델 / 프롬프트 / 호출 횟수 결정
- ❌ Style Inventory 의 추가 항목 작성 (별도 작업)
---
## 6. 단계적 작성 계획
| 차수 | 작성 내용 | 상태 |
|---|---|---|
| 1 차 | skeleton + 책임 영역 정의 | ✅ |
| 2 차 | Zone Catalog 본격 — frame ↔ Zone 매핑 / 프리셋 / 매칭 분기 (본 문서 § 7) | ✅ |
| 3 차 | Family CSS 본격 — Area 후보 / variant 참조 / token 참조 / asset 표시 (본 문서 § 8) | ✅ |
| 4 차 | Jinja2 Runtime Templates 본격 — 입력 계약 / 조립 위계 / status 인터페이스 / AI 진입 (본 문서 § 9) | ✅ |
| 5a 차 | AI Boundary 본격 — 호출 단위 / 허용 입출력 / 금지 출력 (본 문서 § 10) | ✅ |
| 5b 차 | Token Resolution 본격 — 4 status 처리 룰 / scale 위계 매핑 / 보류 원칙 (본 문서 § 11) | ✅ |
| 5c 차 | Asset Policy 본격 — 의존도 / 자산 유형 / 5 상태 라벨 / asset_meta (본 문서 § 12) | ✅ |
| 5d 차 | Variant Model 본격 — 표현 방식 선택 / family 별 variant 관리 / 추가-분리-폐기 기준 (본 문서 § 13) | ✅ |
| 5e 차 | Fallback Behavior 본격 — status 진입 후 동작 / 5 차 Fallback / AI 경계 / 레이아웃 회귀 (본 문서 § 14) | ✅ |
| 6 차 | 통합 검증 + Phase Z-2 구현 진입 결정 (본 문서 § 15) | ✅ 검증 완료, 구현 착수 별도 승인 |
각 차수마다 user 검토 후 다음 진입. **6 차 완료 = 현재 위치** (1~5e 본격 설계 + 통합 검증 모두 완료). Phase Z-2 구현 착수는 *별도 사용자 승인* 후.
---
## 7. Zone Catalog — 2 차 본격 설계
> ⚠️ 본 섹션은 **Zone Catalog 책임 영역만** 다룬다. Family CSS / Jinja2 / Fallback 실제 동작 / AI 호출 등 다른 영역 침범 X.
> ⚠️ Frame Inventory / FRAME-INTEGRATION-MAP.md 의 표 / 통계는 다시 베끼지 않음 — 링크 참조 + catalog 안에서 어떻게 *소비* 되는지만.
### 7.1 Zone Catalog 의 역할
Zone Catalog 는 다음을 책임진다 :
1. **레이아웃 프리셋 ↔ MDX 콘텐츠** 결정 — Type A / B / B' / B'' 중 어느 프리셋이 본 MDX 에 적합한가
2. **Zone 슬롯 ↔ frame** 매핑 — 각 Zone 에 어느 frame 후보가 들어갈 수 있나
3. **catalog status 라벨 부여**`zone_application × confidence` 매트릭스 결과 (§ 7.4)
받는 입력 :
- `FRAME-INTEGRATION-MAP.md` — 32 frame 의 `zone_application` 라벨
- 매칭 시스템 (V1~V4, `tests/matching/`) — frame ↔ MDX confidence 점수
출력 :
- 본 MDX 에 대한 *Zone 별 catalog status 라벨*
- 후속 영역 (Family CSS / Fallback / AI) 으로 전달되는 신호
**Zone Catalog 는 라벨 부여까지만**. 라벨 후 실제 적용은 Family CSS / Fallback Behavior / AI Boundary 영역.
### 7.2 레이아웃 프리셋 + Zone 타입
Phase Z 위계의 두 레벨을 분리해서 정의한다.
#### 7.2-1 레이아웃 프리셋 후보
slide-body (≈ 1200×590) 를 어떻게 나누는가. 프리셋 4 종 (IMPROVEMENT-REDESIGN.md 참조) :
| Preset | 분배 형태 | 적합한 콘텐츠 신호 |
|---|---|---|
| `Type A` | sidebar-right (`title / body / sidebar`) | reference 꼭지 1+ |
| `Type B` | top + bottom (단일 강조 + 보조) | hero-detail 류 |
| `Type B'` | two-column (좌·우 대등) | 비교 류 |
| `Type B''` | three-section (3 영역 분할) | 3 카테고리 / 3 단계 |
**catalog 가 결정** — MDX 콘텐츠 신호 ↔ 프리셋 선택. 결정 룰의 구체화는 추가 차수.
**결정 안 함** — 프리셋 안의 시각 디자인 (Family CSS), 프리셋 내부 HTML 구조 (Jinja2).
#### 7.2-2 Zone 타입 후보
각 프리셋이 만들어낸 *슬롯의 역할* 후보. 슬롯 위치 ↔ 콘텐츠 role.
| Zone slot 위치 (예) | 받을 수 있는 콘텐츠 role 후보 |
|---|---|
| `top` | summary / overview / key-insight / table-header |
| `bottom_l` / `bottom_r` | detail / compare-side / supporting |
| `sidebar` | reference / quote / supporting-list |
| `body` (single) | full-pattern / hero-detail / compare-rows |
**catalog 가 결정** — 어느 Zone 슬롯이 어느 콘텐츠 role 을 받을지.
**결정 안 함** — 슬롯 안 시각 디자인, 슬롯 안 frame 의 stylization.
### 7.3 frame zone_application 과 catalog 의 관계
`FRAME-INTEGRATION-MAP.md` 의 4 라벨 (`zone_direct / zone_adapt / zone_extract / reference_only`) 을 catalog 가 어떻게 *소비* 하는가 :
| zone_application | catalog 의 소비 방식 |
|---|---|
| `zone_direct` | frame 구조 그대로 zone 슬롯에 매핑. catalog 는 슬롯 사이즈만 통과 |
| `zone_adapt` | frame 구조 동일, 사이즈 / 비율 재조정 hint 와 함께 후속 영역 (Family CSS) 에 전달 |
| `zone_extract` | frame 의 일부 패턴만 (예 : 3-column 만 추출) hint 와 함께 후속 영역에 전달 |
| `reference_only` | runtime 적용 X — `not_runtime_candidate` 라벨링. 디자인 톤 참고만 |
→ 4 라벨의 *분류 자체* 는 FRAME-INTEGRATION-MAP.md 가 결정. catalog 는 *소비 방식* 만 책임.
### 7.4 catalog status 라벨 — `zone_application × confidence` 매트릭스
본 catalog 의 *핵심 출력*. 두 축은 **직교** :
- `zone_application` = frame 자체의 Zone 적용 방식 (frame 의 *고유 속성*)
- `confidence` = 특정 MDX 콘텐츠 ↔ frame 매칭 품질 (콘텐츠 ↔ frame *상호작용*)
매트릭스 (4 × 3 = 12 셀, 6 라벨) :
| | `high` | `medium` | `low` |
|---|---|---|---|
| `zone_direct` | `matched_zone` | `review_required` | `fallback_candidate` |
| `zone_adapt` | `adapt_matched_zone` | `review_required` | `fallback_candidate` |
| `zone_extract` | `extract_matched_zone` | `review_required` | `fallback_candidate` |
| `reference_only` | `not_runtime_candidate` | `not_runtime_candidate` | `not_runtime_candidate` |
> **원칙 — `medium` confidence 는 자동 확정하지 않는다.**
>
> Zone 적용 방식이 `zone_direct`, `zone_adapt`, `zone_extract` 중 무엇이든,
> confidence 가 `medium` 이면 `review_required` 로 보낸다.
이유 : Phase Z 절대 룰 *"불일치 시 레이아웃 회귀 — 콘텐츠 줄이지 않고 그릇 변경"* 과 정합. 자동화가 과감해지는 것 방지.
각 라벨의 의미 :
| 라벨 | 의미 |
|---|---|
| `matched_zone` | `zone_direct` × `high`. 즉시 적용 후보 |
| `adapt_matched_zone` | `zone_adapt` × `high`. 사이즈 재조정 적용 후보 |
| `extract_matched_zone` | `zone_extract` × `high`. 일부 패턴 추출 적용 후보 |
| `review_required` | 모든 `medium`. 사람 / 후속 단계 검토 필요 |
| `fallback_candidate` | `zone_direct/adapt/extract` × `low`. fallback 진입 |
| `not_runtime_candidate` | `reference_only` × any. 디자인 톤 참고만 |
> `fallback_candidate` 는 fallback 동작을 실행한다는 뜻이 아니라, Fallback Behavior 설계로 넘길 **후보 상태** 를 의미한다.
**catalog 는 라벨 부여까지만**. 라벨 후의 실제 동작은 Fallback Behavior / AI Boundary / Family CSS 영역.
### 7.5 Zone Catalog 가 결정하지 않는 것
Skeleton § 4.1 의 "결정 안 함" 확장 + 본 2 차에서 추가 명확화 :
- ❌ frame 의 시각 / 스타일 (→ Family CSS, 미작성)
- ❌ HTML 구조 / 슬롯 마크업 (→ Jinja2 Runtime Templates, 미작성)
- ❌ AI 호출 시점 / 입력 형식 (→ AI Boundary, 미작성)
-`fallback_candidate` 진입 후 실제 동작 (→ Fallback Behavior, 미작성)
-`review_required` 진입 후 처리 흐름 (→ AI Boundary 또는 Fallback Behavior, 미작성)
-`not_runtime_candidate` frame 의 디자인 톤 적용 방식 (→ Asset Policy 또는 Style Inventory)
- ❌ variant 표현 방식 (→ Variant Model, 미작성)
- ❌ token 선택 / 적용 (→ Token Resolution, 미작성)
- ❌ confidence 임계값 자체 (예 : 몇 % 이상이 `high` 인가) — 매칭 시스템 (V1~V4) 의 책임. catalog 는 라벨화된 confidence 만 받음
---
### 7 차수 자체 점검 (작성 후)
- ✅ Zone Catalog 영역만 다룸 (Family CSS / Jinja2 / Fallback 실제 동작 / AI 호출 침범 X)
- ✅ Frame Inventory 32 행 표 redescription 0 — 링크 참조만
- ✅ FRAME-INTEGRATION-MAP.md 분포 통계 redescription 0
- ✅ 직교 축 (`zone_application``confidence`) 명시
- ✅ "medium 자동 확정 X" 원칙 prominent callout
- ✅ Skeleton § 4.1 의 "결정 안 함" 8 항목 § 7.5 에서 확장
- ✅ catalog 가 *결정함* 까지만, 결정 후 동작은 후속 영역 명시
---
## 8. Family CSS — 3 차 본격 설계
> ⚠️ **룰 1** — 본 섹션은 **Family CSS 관점에서 variant / token / asset 을 어떻게 *참조* 하는지만** 다룬다. Variant Model 자체, Token Resolution 자체, Asset Policy 자체는 후속 dedicated 영역 (§ 4.5 / 4.6 / 4.7) 에서 결정.
>
> ⚠️ **룰 2** — Family CSS 는 *frame 별 CSS 가 아니라* **family 단위 CSS** 다. frame 차이는 variant / meta 로 표현한다.
### 8.1 Family CSS 의 역할
Family CSS 는 다음을 책임진다 :
1. **family 단위 시각 / 스타일 규칙** 정의 — 같은 family 안 frame 들의 공통 패턴
2. **variant 슬롯 노출** — frame 차이를 family 안 variant 로 받아낼 수 있는 hook
3. **token / asset 참조 인터페이스** — Token Inventory / Asset Policy 의 *소비자*
받는 입력 :
- Frame Inventory 의 `Phase Z Target` 컬럼 (family 후보)
- Token Inventory 의 4 status (covered / gap_candidate / hierarchy_mapping_only / hold)
- Frame Inventory 의 `Asset Notes` (자산 의존도)
- Zone Catalog (§ 7) 의 status 라벨 (matched_zone / adapt_matched_zone / extract_matched_zone — Family CSS 적용 후보 신호)
**Family CSS 는 family 단위 패턴 정의까지만**. variant 모델 자체 / token 채택 / asset 정책은 후속 영역.
### 8.2 Family CSS Area 후보 (11)
본 섹션의 **centerpiece**. Frame Inventory 의 `Phase Z Target` 컬럼을 family 단위로 수렴한 결과.
| Family CSS Area 후보 | 흡수 frame | 변형 축 (variant 후보) | asset 의존도 | Notes |
|---|---|---|---|---|
| `compare-paired.css` (후보) | F17, F18 | `paired-rows` (F17) / `vs-center-badge` (F18) | mid | F17 R16 두루마리 pill 이미지 의존. F18 의 center badge 컬럼이 variant 키 |
| `compare-table.css` (후보) | F23, F24 (+ F30, F31 미변환 통합 후보) | `columns[N=2~4]` / `header_style` / `row_density` | low | line 은 CSS border 변환 가능. 30/31 변환 후 variant range 확정 |
| `split-panel.css` (후보) | F21, F22 | `right_items[N=3~8]` / `left_categories[N=2~5]` / `bracket_image` (optional) | high | 14~15 자산 (배경 / 뱃지 / 화살표 / 행 바). Phase Z 재현 시 자산 풀 필수 |
| `persona-cards.css` (후보) | F14 | `actor_count[3]` / `actor_hue_palette` / `photo_required` | high | 사진 ×3 필수 (placeholder / 사용자 자산), badge outer/inner ×6, 체크박스 ×20 |
| `three-pillar.css` (후보) | F13 | `pillars[3]` (현재 고정) / `column_hue_palette` | low | 아이콘 PNG 1, 테두리 SVG 4 → CSS 변환 가능 |
| `quadrant.css` (후보) | F16 | `quadrants[4]` (고정) / `bar_style` / `center_quote` (optional) | mid | 배경 텍스처 PNG ×4 동일, bar SVG → CSS gradient 변환 가능 |
| `pill-list.css` (후보) | F09 | `items[N=3~7]` / `stacking_pattern` / `arc_decoration` (optional) | low | 아크 SVG / 화살표 SVG 만 이미지 유지. pill 본체 CSS |
| `cycle.css` (후보) + svg helpers (helper area 후보) | F12 | `main_circles[3]` (현재 고정) / `accent_circles[6]` | mid | 19 SVG (Ellipse) — 좌표 기반 SVG 재구성 가능. bg_texture PNG 1 |
| `split-center.css` (후보) | F27 | (sparse data — 추가 관찰 후 확정) | mid | flat.md sparse. variant range 후속 차수에서 |
| `system-diagram.css` (후보) | F07 | (sparse data — 추가 관찰 후 확정) | very high | 16 자산. 자산 풀 필수 |
| (asset-heavy / reference-like family 후보) | F01 | (variant 미정 — pure CSS family 아님) | very high | 9 자산 모두 이미지. CSS 패턴이라기보다 *asset slot 컴포넌트*. family 분류 자체 검토 후보 |
**주의** :
- Family CSS Area 후보 = 결정 X. 실제 파일 생성 / 이름은 사용자 승인 후.
- 11 개 → 최종 family 수는 더 줄 수 있음 (특히 sparse data F07 / F27 / F01 은 추가 검증 후 통합 / 분리 결정).
- F01 은 *pure CSS family 아님* — 별도 분류 필요할 수 있음 (asset-heavy / reference-like family).
→ FRAME-INTEGRATION-MAP.md 의 frame 별 분류는 redescribe 안 함. 본 표는 **family 수렴 결과** 만.
### 8.3 variant 참조 방식
Family CSS 는 frame 차이를 variant 로 받아낸다. variant 의 **표현 방식 후보** :
| 후보 방식 | 예시 | 적합한 케이스 |
|---|---|---|
| **CSS class modifier** | `.compare-paired.--vs-center-badge` | 시각 / 구조가 크게 다른 variant (F17 vs F18 의 pill alternation vs center badge) |
| **Data attribute** | `[data-variant="paired-rows"]` | 마크업은 같고 styling 만 분기 |
| **Template parameter** | Jinja2 `{{ variant }}` 변수 + family CSS 의 조건부 selector | 슬롯 수 / cardinality 차이 (예 : `columns[N=2~4]`) |
| **Variant family 자체 분기** | `compare-table--2col.css` / `compare-table--3col.css` (별도 entry) | columns 차이가 너무 클 때 (현재 시점에서는 over-split, 비추천) |
**Family CSS 가 결정함** : variant 별로 *어느 표현 방식* 을 채택하는가 (참조 인터페이스만)
**Family CSS 가 결정하지 않음** : variant 자체의 분류 / 추가 / 폐기 (→ § 4.7 Variant Model, 5 차)
→ 본 차수에서는 표현 방식 후보 4 개 나열까지만. 어느 family 가 어느 방식을 쓸지의 결정은 5 차 Variant Model.
### 8.4 token 참조 방식
Family CSS 가 Token Inventory 의 4 status 를 어떻게 *참조* 하는가 :
| Token Inventory status | Family CSS 의 참조 방식 |
|---|---|
| `covered` | 기존 token 그대로 `var(--color-block-title-from)` 등 사용. 신규 정의 X |
| `gap_candidate` | **참조 placeholder 사용**`var(--c-table-header-cyan)` (후보) 식으로 *후보 이름* 표기. 실제 token 추가 / 채택은 § 4.5 Token Resolution 의 결정 |
| `hierarchy_mapping_only` | frame raw px (figma 1280 폭) 직접 사용 X. slide-body 위계 토큰 (`--font-zone-title` / `--font-sub-title` 등) 참조 + zoom / scale 메타는 § 4.5 의 결정 |
| `hold_recheck_after_conversion` | Family CSS 에서 사용 X. 폐기 단정 X (32 frame 변환 후 재검증) |
**Family CSS 가 결정함** : 어느 token 을 어느 슬롯에 쓰는가 (참조 매핑)
**Family CSS 가 결정하지 않음** : token 자체의 추가 / 변경 / 폐기 (→ § 4.5 Token Resolution, 5 차)
> Token Inventory 의 4 status 표는 [`PHASE-Z-FRAME-STYLE-INVENTORY.md`](PHASE-Z-FRAME-STYLE-INVENTORY.md) 참조. 본 섹션에서 redescribe X.
### 8.5 asset 의존 표시 방식
asset-heavy family 의 self-policy 표시. § 8.2 의 `asset 의존도` 컬럼이 이미 분류 (low / mid / high / very high). Family CSS 는 이 분류를 self-meta 로 표시.
| 의존도 | Family CSS 의 표시 방식 (후보) |
|---|---|
| `low` | meta 표시 불필요 |
| `mid` | family 헤더 주석에 `asset-dependency: mid` + 자산 항목 명시 (예 : SVG 아이콘 / 이미지 1~3 개) |
| `high` | family 헤더 주석에 `asset-dependency: high` + placeholder 정책 명시 (예 : "사진 ×3 — 사용자 제공 자산 필요") |
| `very high` | family 헤더 주석에 `asset-dependency: very high` + **runtime 적용 시 자산 풀 / placeholder 필수** 경고 |
특수 케이스 : F01 같은 asset-heavy / reference-like family 는 **pure CSS family 가 아님** 명시. family 분류 자체가 asset slot 컴포넌트 / reference 후보 임을 self-meta 로.
**Family CSS 가 결정함** : 의존도 self-meta 표시 형식 (참조 인터페이스)
**Family CSS 가 결정하지 않음** : asset placeholder 의 실제 디자인 / 자산 풀 / 사용자 제공 정책 (→ § 4.6 Asset Policy, 5 차)
### 8.6 Family CSS 가 결정하지 않는 것
Skeleton § 4.2 의 "결정 안 함" 확장 + 본 3 차에서 추가 명확화 :
- ❌ HTML 마크업 자체 (→ Jinja2 Runtime Templates, 미작성)
- ❌ frame ↔ Zone 매핑 (→ Zone Catalog, § 7 작성됨)
- ❌ 텍스트 콘텐츠 / AI 호출 (→ AI Boundary, 미작성)
- ❌ variant 모델 자체 (분류 / 추가 / 폐기) — 본 § 8.3 에서는 *참조 표현 방식* 후보만 (→ § 4.7 Variant Model, 5 차)
- ❌ token 자체 (값 / 추가 / 변경 / 폐기) — 본 § 8.4 에서는 *참조 방식* 만 (→ § 4.5 Token Resolution, 5 차)
- ❌ asset 정책 자체 (placeholder 디자인 / 자산 풀 / 사용자 제공 룰) — 본 § 8.5 에서는 *self-meta 표시* 만 (→ § 4.6 Asset Policy, 5 차)
- ❌ frame 별 CSS — Family CSS 는 family 단위 (룰 2 재확인)
- ❌ 실제 CSS 파일 생성 / 이름 확정 / 위치 — 사용자 승인 후 별도 단계
- ❌ legacy `templates/blocks/structures/` 6 파일 삭제 — 사용자 승인 후
---
### 8 차수 자체 점검 (작성 후)
- ✅ Family CSS 영역만 다룸 (Variant Model 자체 / Token Resolution 자체 / Asset Policy 자체 / Jinja2 / AI 침범 X)
- ✅ Frame Inventory `Phase Z Target` 컬럼 redescription 0 — family 수렴 결과만
- ✅ Token Inventory 4 status 표 redescription 0 — 링크 참조만
- ✅ FRAME-INTEGRATION-MAP.md 분류 redescription 0
- ✅ 룰 1 (참조하는지만 다룸) + 룰 2 (frame 별 X / family 단위) 섹션 머리에 명시
- ✅ family 후보 11 개 centerpiece (자산 의존도 분류 포함)
- ✅ F01 asset-heavy / reference-like family 별도 분류 명시
- ✅ Skeleton § 4.2 의 "결정 안 함" 8.6 에서 확장 + 5 차 dedicated 영역 cross-reference
---
## 9. Jinja2 Runtime Templates — 4 차 본격 설계
> ⚠️ **룰 1** — Jinja2 는 HTML 구조를 조립한다. AI 는 Jinja2 구조를 만들지 않는다. AI 출력은 이미 정해진 zone slot 안의 콘텐츠 값으로만 들어온다.
>
> ⚠️ **룰 2** — Jinja2 는 *조립 실행자* 다. status label 결정 / variant 채택 결정 / fallback 정책은 다른 영역에서 받은 결정. Jinja2 는 그 결정을 받아 *조립* 만 한다.
### 9.1 Jinja2 Runtime Templates 의 역할
Jinja2 는 다음을 책임진다 :
1. **HTML 구조 조립** — slide-base → slide-body → layout preset → zone → family partial 의 마크업 조합
2. **슬롯 배치** — zone slot 위치에 family partial / 콘텐츠 삽입
3. **검증 hook 위치** — overflow 측정 / 시각 품질 평가 fixture 위치
4. **본문 preview ↔ 팝업 원문 분리** — 텍스트 무손실 보존 (Phase Z 절대 룰)
받는 입력 :
- Zone Catalog (§ 7) : `layout_preset`, zone status label
- Family CSS (§ 8) : family partial 식별자, variant
- AI 출력 : zone 단위 콘텐츠
- MDX 원문 : preview / popup 분리용
→ Jinja2 = **조립 실행자**. 받은 결정을 마크업으로 직조하기만.
### 9.2 입력 데이터 계약
Jinja2 가 받는 입력의 *필드 shape* :
| 필드 | 출처 | shape / 예시 |
|---|---|---|
| `slide_meta` | MDX 분석 (Stage 1) | `{ chapter_title, conclusion, footer_text }` |
| `layout_preset` | Zone Catalog (§ 7.2-1) | `Type A` / `Type B` / `Type B'` / `Type B''` |
| `zones[]` | Zone Catalog (§ 7) | `[{ zone_id, slot_position, status_label, frame_id, content }, ...]` |
| `zone.content` | AI 출력 (zone 단위) + MDX 원문 | `{ preview_text, popup_full, slot_payload }` |
| `family_meta` | Family CSS (§ 8) | `{ family_id, variant, asset_dependency }` |
**Jinja2 가 결정함** : 위 입력 shape 를 *수신* 하고 *마크업* 으로 변환.
**Jinja2 가 결정하지 않음** : 필드 값 자체 (각 출처 영역의 결정), 새 필드 추가 / 변경.
### 9.3 조립 위계
Phase Z 위계가 Jinja2 안에서 어떻게 표현되는가 :
```
slide-base (existing template)
├─ slide-title ← MDX 대목차 자동 매핑
├─ slide-divider (고정)
├─ slide-body (≈ 1200×590)
│ └─ layout preset (Type A / B / B' / B'')
│ └─ zones[] (preset 별 slot 정의)
│ └─ family partial (family CSS 영역)
│ └─ slot content (AI 출력 + MDX 원문)
└─ slide-footer ← MDX 대목차 결론 자동 매핑
```
**Jinja2 가 결정함** :
- 위계 각 단계의 wrapper / container 마크업
- preset → zones 분배 메커니즘 (preset-specific Jinja2 partial)
- zone → family partial 임베딩 위치
- preview ↔ popup 분리 마크업 위치
**Jinja2 가 결정하지 않음** :
- preset 선택 (→ Zone Catalog § 7.2-1)
- zone slot 의 콘텐츠 role 매핑 (→ Zone Catalog § 7.2-2)
- family partial 의 시각 / 스타일 (→ Family CSS § 8)
- frame 별 차이 (→ family variant, § 8.3)
### 9.4 Zone Catalog status label → 조립 인터페이스
§ 7.4 의 6 status label 을 Jinja2 가 어떻게 *받아* 조립하는가. **정책 결정 X, 조립 인터페이스만**.
| Status label | Jinja2 의 조립 인터페이스 |
|---|---|
| `matched_zone` | family partial 렌더 대상. 입력 shape 그대로 마크업 조립 |
| `adapt_matched_zone` | family partial 렌더 대상 (adapt hint 를 `family_meta` 로 전달, 실제 스타일 처리는 Family CSS) |
| `extract_matched_zone` | family partial 렌더 대상 (extract hint 를 `family_meta` 로 전달) |
| `review_required` | preview / review payload 로 분리 마크업, 검토 marker 부착 |
| `fallback_candidate` | **Jinja2 직접 렌더 대상 아님** — Fallback Behavior 로 위임 |
| `not_runtime_candidate` | **런타임 family partial 렌더 대상 아님** — 디자인 톤 참고만 (Asset Policy / Style Inventory) |
> 본 표는 *Jinja2 의 조립 인터페이스* 만 정의한다. 실제 fallback 동작 / review 처리 흐름 / not_runtime 의 디자인 톤 적용은 § 4.6 / § 4.8 의 영역.
### 9.5 AI 출력의 Jinja2 진입 위치
AI 출력은 **`zone.content` 의 sub-필드** (§ 9.2) 로만 들어온다.
| 진입 허용 필드 | 의미 |
|---|---|
| `zone.content.preview_text` | zone slot 본문 preview (AI 가 다듬은 짧은 표시 텍스트) |
| `zone.content.popup_full` | 팝업 / `<details>` / 별도 레이어 원문 (MDX 무손실) |
| `zone.content.slot_payload` | family partial 의 슬롯별 콘텐츠 (예 : `{ title, body, items[] }`) |
**진입 금지 영역** (Phase R' 회귀 방지) :
- ❌ HTML 구조 자체 (slide-base / slide-body / preset / zone / family partial 의 wrapper)
- ❌ class 명 / data attribute / id
- ❌ Jinja2 template (`{% %}` / `{{ }}` 매크로)
- ❌ family 선택 / variant 선택 / preset 선택
- ❌ 새 frame 결정 / catalog status label 결정
> AI 가 출력할 수 있는 것은 *콘텐츠 값* 만. 구조 / 스타일 / 매핑은 모두 코드의 영역.
>
> 이 경계가 무너지면 Phase R' 의 "AI 가 HTML 구조 직접 생성" 회귀로 빠진다. **Jinja2 의 입력 계약 (§ 9.2) 이 이 경계의 강제 메커니즘**.
### 9.6 Jinja2 가 결정하지 않는 것
Skeleton § 4.3 의 "결정 안 함" 확장 + 본 4 차 추가 :
- ❌ frame 시각 / 스타일 (→ Family CSS § 8)
- ❌ frame ↔ Zone 매핑 / preset 선택 / status label 부여 (→ Zone Catalog § 7)
- ❌ AI 모델 / 프롬프트 / 호출 횟수 (→ AI Boundary § 4.4, 5 차)
- ❌ token 자체 (→ Token Resolution § 4.5, 5 차)
- ❌ asset 정책 자체 (→ Asset Policy § 4.6, 5 차)
- ❌ variant 모델 자체 (→ Variant Model § 4.7, 5 차)
- ❌ fallback 실제 동작 (→ Fallback Behavior § 4.8, 5 차)
- ❌ review_required 진입 후 검토 흐름 (→ AI Boundary 또는 Fallback Behavior, 5 차)
- ❌ 실제 Jinja2 파일 생성 / 마크업 코드 작성 — 사용자 승인 후 별도 단계
- ❌ CSS class / id naming 확정 — 구현 단계
---
### 9 차수 자체 점검 (작성 후)
- ✅ Jinja2 영역만 다룸 (정책 결정 / Family CSS / AI 영역 / Fallback 동작 침범 X)
- ✅ Frame Inventory / Token Inventory / Section 7~8 표 redescription 0
- ✅ 룰 1 (HTML 조립 / AI 는 zone slot 콘텐츠만) + 룰 2 (조립 실행자 / 정책 결정자 X) 섹션 머리 명시
- ✅ § 9.2 입력 데이터 계약 필드 shape 5 개 명시
- ✅ § 9.4 status label *조립 인터페이스* 까지만, 정책 결정 X (fallback 동작 / review 흐름은 후속 영역)
- ✅ § 9.5 AI 진입 허용 / 금지 명시 — Phase R' 회귀 방지 메커니즘
- ✅ § 9.6 boundary 10 항목 + 5 차 dedicated 영역 cross-reference
---
## 10. AI Boundary — 5a 본격 설계
> ⚠️ **룰 1 — AI 호출 단위는 zone 안 콘텐츠다.**
>
> 슬라이드 전체 / 레이아웃 / 프리셋 / family 선택 / 새 frame 결정 / status label 결정은 AI 의 영역이 아니다.
> ⚠️ **룰 2 — AI 출력은 `zone.content.*` 의 콘텐츠 값만이다.**
>
> HTML / CSS / class / Jinja2 / 구조 결정은 AI 출력에 포함하지 않는다.
### 10.1 AI Boundary 의 역할
AI Boundary 는 다음을 책임진다 :
1. **AI 호출 단위 정의** — 한 호출 = 하나의 zone 안 콘텐츠 scope
2. **허용 입력 / 출력 형식 정의** — AI 가 받는 것 / 만드는 것의 contract
3. **금지 영역 정의** — AI 가 만들지 말아야 할 것 (Phase R' 회귀 방지)
4. **Jinja2 입력 계약 (§ 9.2) 과의 정합**`zone.content.*` 필드와 cross-reference
받는 입력 :
- Zone Catalog (§ 7) : zone 정보 (zone_id, slot_position, frame_id, status_label)
- Family CSS (§ 8) : family meta (family_id, variant, asset_dependency)
- MDX 원문 : 해당 zone 에 속하는 부분
→ AI Boundary = **AI 의 활동 반경 정의**. 모델 / 프롬프트 / 호출 빈도는 본 차수 X.
### 10.2 AI 호출 단위 — zone content only (scope)
한 AI 호출 = **하나의 zone 안 콘텐츠** 단위.
| scope 단위 | 허용 / 금지 |
|---|---|
| 한 zone 안 콘텐츠 | ✅ AI 호출 단위 |
| 슬라이드 전체 | ❌ |
| 레이아웃 / 프리셋 결정 | ❌ |
| family / variant 선택 | ❌ |
| 새 frame 발굴 / 결정 | ❌ |
| status label 부여 | ❌ |
→ 한 슬라이드 = N 개 zone = 최대 N 회 AI 호출 (zone 별 1 회 단위). 호출 횟수 / 빈도 / 시점은 본 차수 X (파이프라인 / Fallback 영역).
### 10.3 허용 입력 / 허용 출력
#### 허용 입력 (AI 가 받는 것)
| 필드 | 의미 |
|---|---|
| `zone_meta` | `{ zone_id, slot_position, status_label, frame_id }` |
| `family_meta` | `{ family_id, variant, asset_dependency }` |
| `mdx_excerpt` | 해당 zone 에 속하는 MDX 원문 |
| `style_hint` | family 의 스타일 힌트 (예 : "title 위계", "body 위계") — Family CSS 영역에서 전달 |
| `layout_meta` | `{ preset_id, neighbor_zones }` — 이웃 zone 컨텍스트 (선택) |
#### 허용 출력 (AI 가 만드는 것 — `zone.content.*`)
| 필드 | 의미 |
|---|---|
| `zone.content.preview_text` | zone slot 본문 preview (짧은 표시 텍스트) |
| `zone.content.popup_full` | 팝업 / `<details>` 원문 (MDX 무손실 또는 AI 가 재구성한 무손실 버전) |
| `zone.content.slot_payload` | family partial 슬롯별 콘텐츠 (예 : `{ title, body, items[] }`) |
→ 출력 3 필드 모두 § 9.2 의 `zone.content.*` 안에 들어간다.
### 10.4 금지 출력
AI 가 출력에 포함하면 안 되는 것 :
- ❌ HTML 구조 (`<div>`, `<section>`, `<table>` 등 wrapper / container 마크업)
- ❌ CSS class 명 / id / data attribute
- ❌ Jinja2 template 매크로 (`{% %}` / `{{ }}`)
- ❌ family 선택 / variant 선택 / preset 선택
- ❌ 새 frame 결정 / catalog status label 결정
- ❌ token 추가 / 변경 / 폐기 결정
- ❌ asset placeholder 디자인
- ❌ fallback 정책 / review 정책
> 이 금지 출력 영역이 무너지면 **Phase R' 회귀** (AI 가 HTML 구조 직접 생성) 로 빠진다. § 9.5 의 *진입 위치 차단* + § 10.4 의 *금지 출력 명시* 가 두 면 차단 메커니즘.
### 10.5 Jinja2 입력 계약 (§ 9.2) 과의 연결
AI 출력은 Jinja2 입력 계약의 **`zone.content` 필드** 로 들어간다. 입력 계약 안에서 *AI 영역 ↔ 다른 영역* 이 완전 분리됨 :
| Jinja2 입력 계약 필드 (§ 9.2) | 출처 영역 | AI 가 만드는가 |
|---|---|---|
| `zone.content.preview_text` | AI Boundary | ✅ |
| `zone.content.popup_full` | AI Boundary | ✅ |
| `zone.content.slot_payload` | AI Boundary | ✅ |
| `slide_meta` | MDX 분석 (Stage 1) | ❌ |
| `layout_preset` | Zone Catalog (§ 7) | ❌ |
| `zones[]` 자체 / `zone_id` / `status_label` | Zone Catalog (§ 7) | ❌ |
| `family_meta` | Family CSS (§ 8) | ❌ |
**Jinja2 입력 계약 자체가 boundary 강제 메커니즘**. AI 가 잘못된 영역에 출력해도 입력 계약 단계에서 reject 가능 (구현 단계 결정).
### 10.6 AI Boundary 가 결정하지 않는 것
Skeleton § 4.4 의 "결정 안 함" 확장 + 본 5a 추가 :
- ❌ 구체 프롬프트 / 모델 (구현 영역)
- ❌ 호출 비용 / 토큰 사용량 / 응답 시간 (구현 영역)
-**AI 호출 시점 / 빈도** — AI Boundary 는 *호출 시 무엇을 받고 무엇을 만드는가* 까지만, *언제 부르는가* 는 파이프라인 / Fallback Behavior 영역
- ❌ fallback 실제 실행 절차 (→ Fallback Behavior § 4.8, 5e)
- ❌ review_required 의 검토 흐름 (→ Fallback Behavior 또는 파이프라인)
- ❌ token 자체 (값 / 추가 / 변경 / 폐기) (→ Token Resolution § 4.5, 5b)
- ❌ asset 정책 자체 (→ Asset Policy § 4.6, 5c)
- ❌ variant 모델 자체 (→ Variant Model § 4.7, 5d)
- ❌ HTML 구조 / Jinja2 마크업 (→ Jinja2 § 9, Phase R' 회귀 방지)
- ❌ AI 응답 검증 / 재호출 정책 (구현 영역)
---
### 5a 차수 자체 점검 (작성 후)
- ✅ AI Boundary 영역만 다룸 (Token / Asset / Variant / Fallback / Jinja2 / Zone Catalog 침범 X)
- ✅ Frame Inventory / Token Inventory / Section 7~9 표 redescription 0
- ✅ 룰 1 (호출 단위 = zone) + 룰 2 (출력 = `zone.content.*` 콘텐츠 값만) 섹션 머리 명시
- ✅ § 10.4 금지 출력 + § 9.5 금지 진입 = 두 면 Phase R' 회귀 차단
- ✅ § 10.5 가 § 9.2 입력 계약과의 cross-reference 명시 (AI ↔ 다른 영역 분리)
- ✅ § 10.6 에 "AI 호출 시점 / 빈도" 비범위 명시 (Fallback / 파이프라인 정책 침범 차단)
- ✅ Skeleton § 4.4 의 "결정 안 함" 10 항목으로 확장
---
## 11. Token Resolution — 5b 본격 설계
> ⚠️ **룰 1 — Token Resolution 은 token 적용 판단을 정의하지만 token 파일을 수정하지 않는다.**
>
> `covered`, `gap_candidate`, `hierarchy_mapping_only`, `hold_recheck_after_conversion` 은 모두 *설계 상태* 이며 *구현 결정* 이 아니다.
> ⚠️ **룰 2 — frame raw px 는 slide-body token 값과 직접 매칭하지 않는다.**
>
> typography / spacing / radius 는 *위계 매핑* 만 수행하고, 실제 값은 slide-body scale 에서 재산정한다.
### 11.1 Token Resolution 의 역할
Token Resolution 은 다음을 책임진다 :
1. **4 status 적용 판단 룰** — Token Inventory 의 4 status (covered / gap_candidate / hierarchy_mapping_only / hold_recheck_after_conversion) 별 적용 가능성 판단
2. **frame raw px ↔ slide-body scale 위계 매핑 룰** — figma 1280 폭 기준 raw px 와 slide-body 1200×590 토큰 스케일 사이의 매핑 원칙
3. **추가 / 변경 / 폐기 보류 원칙** — token 파일 수정은 본 차수 X
4. **family CSS 와의 참조 인터페이스** (§ 8.4 cross-reference)
받는 입력 :
- Token Inventory 18 행 ([`PHASE-Z-FRAME-STYLE-INVENTORY.md`](PHASE-Z-FRAME-STYLE-INVENTORY.md))
- Frame Inventory 의 Style Elements 관찰값
- 기존 `templates/styles/tokens/` 3 파일 (colors / spacing / typography)
→ Token Resolution = **token 적용 판단 정의**. 실제 token 파일 수정 / 신규 추가 / 폐기는 본 차수 X.
### 11.2 Token Inventory 4 status 처리 룰
| Status | Token Resolution 판단 룰 |
|---|---|
| `covered` | 기존 token 정확 hex 일치 검증된 상태. family CSS / runtime 에서 *as-is 참조*. 변경 / 추가 결정 X |
| `gap_candidate` | **working name 후보** 로만 유지. 이름 자체 (`--c-table-header-cyan` 등) 도 *아직 확정 X*. 실제 token 추가 / 채택 / 명명은 Phase Z-2 구현 단계 사용자 승인 후 |
| `hierarchy_mapping_only` | typography / spacing / radius 는 raw px 직접 매칭 X. *위계만* 보고 slide-body scale 에서 재산정 (§ 11.3) |
| `hold_recheck_after_conversion` | 미사용 / 폐기 단정 X. 18 미변환 frame 변환 후 *재검증* |
→ 본 표는 4 status 의 *적용 판단* 까지만. token 자체의 값 / 이름 / 추가 / 변경 / 폐기는 본 차수 X.
### 11.3 frame raw px ↔ slide-body scale 위계 매핑
scale 차이 :
| 출처 | scale | 예시 값 |
|---|---|---|
| frame raw px | figma 1280 폭 기준 (zoom 0.49 ~ 1.11 다양) | title 70px / body 35~42px / radius 5~50px |
| slide-body 토큰 | slide-body 1200×590 스케일 | `--font-zone-title` 13px / `--font-body` 11px / `--card-radius` 6px |
위계 매핑 룰 (typography 예시) :
| frame raw 위계 | slide-body 위계 매핑 (후보) |
|---|---|
| frame title (raw 70px Bold + gradient) | `--font-zone-title` (13px) 또는 `--font-sub-title` (12px) — 위계 매칭 |
| frame heading (raw 45~55px Bold) | `--font-sub-title` 위계 |
| frame body (raw 35~42px Medium) | `--font-body` (11px) 위계 |
| frame caption (raw 30px) | `--font-caption` (10px) 위계 |
**위계 매핑 룰만** 본 차수에서 결정. *실제 px 값 매핑* 은 slide-body scale 재산정 영역 (구현 단계).
같은 룰이 spacing / radius 에도 적용 :
- frame raw radius 5 / 30 / 50px ↔ slide-body `--card-radius` 위계
- frame raw gap 8 / 12 / 25px ↔ slide-body `--space-*` 위계
### 11.4 family CSS 와의 참조 인터페이스 (§ 8.4 cross-reference)
§ 8.4 가 결정함 : family CSS 의 token 참조 *syntax* (`var(--color-block-title-from)` 형태)
§ 11.4 가 결정함 : family CSS 가 어느 token 을 *어떤 조건으로* 참조 가능한가의 판단
| Status | family CSS 참조 가능성 |
|---|---|
| `covered` | ✅ 즉시 참조 가능 |
| `gap_candidate` | △ working name 후보로 참조 (token 자체 미정 — 구현 단계 reject 가능) |
| `hierarchy_mapping_only` | ✅ 위계 매칭으로 참조 (raw px 직접 사용 X) |
| `hold_recheck_after_conversion` | ❌ 참조 X |
→ 참조 *syntax* 는 § 8.4. 본 표는 Token Resolution 의 *판단 perspective* 만.
### 11.5 추가 / 변경 / 폐기 보류 원칙
| 행위 | 본 차수 결정 | 위임 |
|---|---|---|
| 신규 token 추가 | ❌ X | Phase Z-2 구현 진입 시 사용자 승인 |
| working name 확정 (`--c-*` 등) | ❌ X | 사용자 승인 영역 |
| 기존 token 값 변경 | ❌ X (covered 는 frame 정확 일치, 변경 사유 없음) | — |
| hold token 폐기 | ❌ X | 32 frame 전체 변환 후 재검증 |
| 명명 컨벤션 (`--c-` / `--g-` / `--fs-` 등) 확정 | ❌ X | working 단계, 사용자 승인 후 최종 |
→ Phase Z 절대 룰 *"기존 templates 삭제 / 교체 실행 X"* + *"새 token / css 파일 생성 X"* 와 정합.
### 11.6 Token Resolution 이 결정하지 않는 것
Skeleton § 4.5 의 "결정 안 함" 확장 + 본 5b 추가 :
- ❌ token 값 자체 (→ Style Inventory / Frame 관찰값)
- ❌ token 파일 생성 / 수정 / 삭제 (구현 영역)
- ❌ 신규 token 이름 최종 확정 (사용자 승인 영역)
- ❌ slide-body scale 재산정의 구체 px 값 (구현 영역)
- ❌ confidence 임계값 (→ 매칭 시스템 V1~V4)
- ❌ family CSS 의 token 참조 *syntax* (→ § 8.4)
- ❌ asset 정책 자체 (→ Asset Policy § 4.6, 5c)
- ❌ variant 모델 자체 (→ Variant Model § 4.7, 5d)
- ❌ AI 호출 자체 (→ AI Boundary § 4.4 / § 10)
- ❌ HTML / CSS / Jinja2 마크업 (→ § 8 / § 9)
---
### 5b 차수 자체 점검 (작성 후)
- ✅ Token Resolution 영역만 다룸 (Style Inventory / 구현 / family CSS syntax / Asset / Variant / AI 침범 X)
- ✅ Token Inventory 18 행 redescription 0 — 4 status *처리 룰*
- ✅ § 8.4 의 표 redescription 0 — *참조 가능성 판단* perspective 만
- ✅ 룰 1 (token 파일 수정 X / 4 status = 설계 상태) + 룰 2 (raw px ≠ slide-body, 위계 매핑만) 섹션 머리 명시
- ✅ § 11.2 에 working name 후보 표현 (gap_candidate 이름 미확정)
- ✅ § 11.3 에 위계 매핑 룰만, 실제 값은 구현 영역
- ✅ § 11.5 추가 / 변경 / 폐기 / 명명 / 컨벤션 5 행위 모두 보류 원칙
- ✅ § 11.6 boundary 10 항목 + 5c~5e dedicated 영역 cross-reference
---
## 12. Asset Policy — 5c 본격 설계
> ⚠️ **룰 1 — Asset Policy 는 자산 처리 기준을 정의하지만 자산을 생성하지 않는다.**
>
> 이미지 / SVG / texture / icon / placeholder 는 모두 *설계 상태* 이며, 실제 파일 생성은 구현 단계.
> ⚠️ **룰 2 — 자산 의존 family 는 metadata 로 표시하고, Jinja2 / Family CSS 는 그 metadata 를 참조한다.**
>
> Asset Policy 는 자산 필요 여부와 처리 분기를 정의한다. 렌더 구조나 CSS 구현은 다른 영역의 책임.
> ⚠️ **룰 3 — Asset Policy 는 생성 도구를 결정하지 않는다.**
>
> Gemini / imagegen / Figma export / 사용자 제공 중 무엇을 쓸지는 *구현 단계* 결정.
### 12.1 Asset Policy 의 역할
Asset Policy 는 다음을 책임진다 :
1. **자산 의존도 등급 처리 룰**`low` / `mid` / `high` / `very high` 정책 해석
2. **자산 유형 분기** — 사진 / texture / icon / 다이어그램 SVG / 장식 5 분류
3. **자산 상태 라벨**`placeholder_allowed` / `user_asset_required` / `asset_optional` / `convertible_to_css_or_svg` / `reference_only`
4. **`asset_meta` 정의** — Jinja2 / Family CSS 가 받을 metadata 형식
5. **추가 / 변경 / 폐기 / 도구 보류 원칙** — 자산 파일 생성 / 도구 선택은 본 차수 X
받는 입력 :
- Frame Inventory `Asset Notes` 컬럼 (자산 항목 / 의존도 관찰값)
- Family CSS § 8.5 의 의존도 self-meta 표시 (`low` / `mid` / `high` / `very high`)
→ Asset Policy = **자산 처리 기준 정의**. 자산 생성 / 도구 / placeholder 디자인은 본 차수 X.
### 12.2 자산 의존도 등급 처리 룰
§ 8.5 와의 perspective 분리 :
- § 8.5 = Family CSS 가 *어떻게 self-meta 를 표시* 하는가 (형식)
- § 12.2 = 각 등급이 *정책적으로 어떻게 해석* 되는가 (의미)
| 등급 | 정책 해석 | 처리 룰 |
|---|---|---|
| `low` | 자산 거의 X. CSS 변환으로 충분 | 별도 정책 불필요. `asset_meta` 불필요 |
| `mid` | 일부 자산 (1~3 개) 이미지 유지 가능 | `asset_meta` 에 자산 항목 + 상태 라벨 표시 |
| `high` | 다수 자산 (10+ 또는 사진). 정책 분기 필수 | `asset_meta` 에 상태 라벨 + 자산 별 처리 분기. `user_asset_required` 가능성 큼 |
| `very high` | 자산이 family 의 핵심 | `asset_meta` 에 상태 라벨 + family 자체의 `reference_only` / asset-heavy 표시 검토 |
Frame Inventory 에서 `high` / `very high` family : `split-panel` (F21/F22) / `persona-cards` (F14) / `system-diagram` (F07) / F01 (reference-like) — 자세한 자산 목록은 [`PHASE-Z-FRAME-STYLE-INVENTORY.md`](PHASE-Z-FRAME-STYLE-INVENTORY.md) 의 `Asset Notes` 참조 (redescription X).
### 12.3 자산 유형 분기
각 family 의 자산을 5 유형으로 분류 :
| 자산 유형 | 특징 | 처리 후보 |
|---|---|---|
| **사진** (사람 / 시공 / 풍경) | 시각 의미 핵심, 재현 / 대체 곤란 | `user_asset_required` 우선 |
| **texture** (배경) | 분위기 / 톤 표현 | `placeholder_allowed` / `convertible_to_css_or_svg` / *생성 가능성* (도구 미정) |
| **icon** (단순 그래픽) | 단순 형태, 의미 핵심 | `convertible_to_css_or_svg` (SVG 인라인 가능성) |
| **다이어그램 SVG** (좌표 기반) | 수학 재구성 가능 | `convertible_to_css_or_svg` (코드 재구성 가능성) |
| **장식** (아크 / 화살표 / 구분선) | 단순 형태, 옵셔널 | `asset_optional` / `convertible_to_css_or_svg` |
→ "생성 가능성" 표현 까지만. 실제 도구 선택 (Gemini / imagegen / Figma export / 사용자 제공) 은 룰 3 에 따라 본 차수 X.
### 12.4 자산 상태 라벨 (5 후보) — centerpiece
본 섹션의 핵심. 각 자산 슬롯이 어떤 처리 정책을 갖는지 라벨링.
| 라벨 | 의미 | 적용 케이스 후보 |
|---|---|---|
| `placeholder_allowed` | placeholder 로 대체 가능 (의미 보존 영향 적음) | texture / 일부 장식 |
| `user_asset_required` | 사용자 제공 필수 (placeholder 불가) | 사진 (시공 / 인물) — 의미 보존 핵심. **5 라벨 중 유일한 의무** |
| `asset_optional` | 자산 없이 렌더 가능 | 장식 (아크 / 화살표) |
| `convertible_to_css_or_svg` | 코드 변환 가능 (자산 불필요) | icon / 다이어그램 SVG / 단순 장식 |
| `reference_only` | runtime 적용 X. 디자인 톤 참고만 | F06 (지도) / F01 (image-heavy reference) family |
자산 유형 × 상태 라벨 직교 매트릭스 (가능성 표) :
| 자산 유형 \ 상태 | `placeholder_allowed` | `user_asset_required` | `asset_optional` | `convertible_to_css_or_svg` | `reference_only` |
|---|---|---|---|---|---|
| 사진 | ❌ | ✅ | ❌ | ❌ | △ (reference-like family 만) |
| texture | ✅ | △ | △ | ✅ | ❌ |
| icon | △ | ❌ | △ | ✅ | ❌ |
| 다이어그램 SVG | ❌ | ❌ | ❌ | ✅ | △ |
| 장식 | ✅ | ❌ | ✅ | ✅ | ❌ |
→ 같은 유형이라도 family / 의도에 따라 라벨이 다를 수 있음. **라벨 부여 자체는 family 별로 결정 (Phase Z-2 구현 진입 시 사용자 승인)**.
### 12.5 `asset_meta` 정의 + Jinja2 / Family CSS 참조 인터페이스
Asset Policy 가 정의하는 metadata 형식 :
| 필드 | shape | 의미 |
|---|---|---|
| `family_id` | string | 어느 family 의 자산인가 |
| `dependency_level` | `low` / `mid` / `high` / `very_high` | 의존도 등급 |
| `assets[]` | `[{ slot_id, asset_type, status_label, hint }, ...]` | family 안 자산 슬롯 목록 |
| `assets[].asset_type` | `photo` / `texture` / `icon` / `diagram_svg` / `decoration` | 자산 유형 (5 분류) |
| `assets[].status_label` | 5 상태 라벨 중 하나 | 처리 정책 |
| `assets[].hint` | string (optional) | 자산 의미 / 위치 hint (placeholder 디자인 시 참고) |
Jinja2 / Family CSS 가 받는 방식 :
- Jinja2 (§ 9.2 입력 계약) 의 `family_meta.asset_dependency` 가 본 `asset_meta.dependency_level` 로 채워짐
- Family CSS (§ 8.5 self-meta) 가 `asset_meta``dependency_level` + `assets[].status_label` 참조
`asset_meta` *정의* 는 본 § 12.5. 실제 *참조 syntax* 는 § 8.5 / § 9.2 (perspective 분리).
### 12.6 Asset Policy 가 결정하지 않는 것
Skeleton § 4.6 의 "결정 안 함" 확장 + 본 5c 추가 :
- ❌ 실제 자산 파일 생성 / 다운로드 / 변환 (구현 영역)
-**생성 도구 선택** (Gemini / imagegen / Figma export / 사용자 제공) — 룰 3
- ❌ placeholder 의 시각 디자인 자체 (구현 영역)
- ❌ SVG 코드 작성 (구현 영역)
- ❌ 사용자 자산 수집 UX / workflow (구현 영역)
- ❌ asset_meta 의 어느 family 의 어느 슬롯이 어느 라벨인지 *최종 부여* (사용자 승인 영역)
- ❌ token 자체 (→ Token Resolution § 4.5 / § 11)
- ❌ variant 모델 자체 (→ Variant Model § 4.7, 5d)
- ❌ HTML / CSS / Jinja2 syntax (→ § 8 / § 9)
- ❌ AI 호출 (→ AI Boundary § 4.4 / § 10)
---
### 5c 차수 자체 점검 (작성 후)
- ✅ Asset Policy 영역만 다룸 (Token / Variant / Fallback / Jinja2 / Family CSS syntax / AI 침범 X)
- ✅ Frame Inventory `Asset Notes` redescription 0 — 자세한 자산 목록 링크 참조
- ✅ § 8.5 의 self-meta 표시 redescription 0 — *정책 해석* perspective 만
- ✅ § 9.2 의 family_meta redescription 0 — asset_meta 정의 + cross-reference
- ✅ 룰 1 + 룰 2 + 룰 3 (생성 도구 결정 X) 섹션 머리 명시
- ✅ § 12.4 5 상태 라벨 centerpiece (`placeholder_allowed` / `user_asset_required` / `asset_optional` / `convertible_to_css_or_svg` / `reference_only`)
-`_required``user_asset_required` 만 (의무 / 정책 상태 분리)
- ✅ § 12.3 자산 유형 5 분류 + § 12.4 직교 매트릭스
- ✅ "생성 가능성" 표현 까지만 (도구 결정 X)
- ✅ § 12.6 boundary 10 항목 + 5d~5e dedicated 영역 cross-reference
---
## 13. Variant Model — 5d 본격 설계
> ⚠️ **룰 1 — Variant Model 은 frame 차이를 family 안에서 표현하는 기준을 정의한다.**
>
> frame 별 CSS 를 만들기 위한 장치가 아니라, *family 단위 수렴을 유지* 하기 위한 장치다.
> ⚠️ **룰 2 — variant 선택은 코드 / catalog 의 결정이다.**
>
> AI 는 variant 를 선택하거나 새 variant 를 만들지 않는다.
### 13.1 Variant Model 의 역할
Variant Model 은 다음을 책임진다 :
1. **variant 가 필요한 경우 / 불필요한 경우 판단 기준** — § 8.3 의 4 표현 방식 후보를 *언제* 사용할지
2. **표현 방식 선택 기준** — class modifier / data attribute / template parameter / variant family 중 어느 것을 어느 케이스에 적용할지의 criteria
3. **family 별 variant 후보 관리 정책** — § 8.2 의 11 family 별 variant 축을 *어떻게 관리* 할지
4. **family 분리 vs variant 흡수의 경계 기준** — 시각 / 구조 차이가 클 때 어느 쪽으로 가는지
받는 입력 :
- Family CSS § 8.3 — 4 표현 방식 후보 (class modifier / data attribute / template parameter / variant family)
- Family CSS § 8.2 — 11 family 후보 + 각 variant 축 1 차 정리
- Frame Inventory `Notes` 의 variant meta (예 : F17 의 `paired-rows`, F18 의 `vs-center-badge`)
→ Variant Model = **variant 의 *선택 기준 / 관리 정책* 정의**. 실제 class 이름 / parameter 이름 / CSS 구현은 본 차수 X.
### 13.2 variant 가 필요한 경우 (판단 기준)
variant 는 *family 를 유지하기 위한 장치* 다. 다음 케이스 별 적합한 처리 :
| 케이스 | 적합한 처리 |
|---|---|
| 같은 family, **시각 / 구조 차이 작음** | variant (class modifier 등) — § 8.3 의 4 표현 방식 후보 중 |
| 같은 family, **cardinality 차이만** (예 : `columns[N=2~4]`) | template parameter |
| 같은 family, **asset 차이만** | asset_meta 분기 (§ 12.5) — variant 영역 X |
| **시각 / 구조 차이 큼** | **별도 family 분리** (variant 로 우겨 넣지 X) |
| 사용 안 되는 variant | 폐기 보류 — 32 frame 전체 변환 후 재검증 (§ 13.5) |
> 🔒 **핵심 원칙** — variant 는 family 를 *유지* 하기 위한 장치이며, family 를 **억지로** 유지하기 위한 장치는 아니다.
>
> frame 차이가 family 의 시각 정체성을 깨뜨릴 정도면 variant 가 아니라 *별도 family 분리* 후보. § 13.5 의 분리 기준 참조.
### 13.3 4 표현 방식 선택 기준 (§ 8.3 cross-reference)
§ 8.3 = Family CSS perspective 에서 4 후보 표현 방식 정의. 본 § 13.3 = *어느 경우 어느 방식을 선택* 할지의 criteria.
| 표현 방식 (§ 8.3 참조) | 적합 criteria | 적합하지 않은 criteria |
|---|---|---|
| **CSS class modifier** | 시각 / 구조 차이가 family 안 변형 (예 : F17 `paired-rows` ↔ F18 `vs-center-badge`) | cardinality 차이만 / asset 차이만 |
| **Data attribute** | 마크업 같고 styling 만 분기 / runtime 동적 변경 가능성 | 시각 차이가 크고 구조까지 다른 경우 |
| **Template parameter** | cardinality 차이 (예 : `columns[N=2~4]`, `items[N=3~7]`) / 슬롯 수 변화 | 시각 디자인 차이 |
| **Variant family** (별도 entry) | 차이가 너무 커 한 family 안 일관 표현 어려운 경우 | 차이 작음 (over-split 위험) |
→ 본 표는 *criteria* 만. 어느 family 가 어느 방식을 채택할지 *결정* 은 § 8.3 (Family CSS perspective) + 사용자 승인. § 8.3 의 표 redescription 0.
### 13.4 family 별 variant 후보 (관리 perspective)
§ 8.2 = Family CSS perspective 에서 11 family 후보 + 각 variant 축 1 차 정리. 본 § 13.4 = *Variant Model 측 관리 후보* perspective.
| Family CSS Area | 1 차 variant 축 (§ 8.2 참조) | Variant Model 관리 후보 |
|---|---|---|
| `compare-paired.css` | `paired-rows` (F17) / `vs-center-badge` (F18) | **CSS class modifier** 적합 (시각 / 구조 차이 family 안 변형) |
| `compare-table.css` | `columns[N=2~4]` / `header_style` / `row_density` | **template parameter** 적합 (cardinality 차이) |
| `split-panel.css` | `right_items[N=3~8]` / `left_categories[N=2~5]` / `bracket_image` | **template parameter** 적합 |
| `persona-cards.css` | `actor_count[3]` / `actor_hue_palette` / `photo_required` | F14 단일 frame, *추가 frame 변환 후 재검증* |
| `three-pillar.css` | `pillars[3]` (현재 고정) / `column_hue_palette` | F13 단일 frame, *추가 frame 변환 후 재검증* |
| `quadrant.css` | `quadrants[4]` (고정) / `bar_style` / `center_quote` | F16 단일 frame, *추가 frame 변환 후 재검증* |
| `pill-list.css` | `items[N=3~7]` / `stacking_pattern` / `arc_decoration` | F09 단일 frame, *추가 frame 변환 후 재검증* |
| `cycle.css` | `main_circles[3]` / `accent_circles[6]` | F12 단일 frame, *추가 frame 변환 후 재검증* |
| `split-center.css` | (sparse data) | F27, *추가 관찰 후 확정* |
| `system-diagram.css` | (sparse data) | F07, *추가 관찰 후 확정* |
| `(asset-heavy / reference-like)` | F01 — pure CSS family X | **variant 영역 X** (→ asset_meta 영역, § 12.5) |
→ § 8.2 의 11 family 표 redescription 0. *관리 perspective* 만 (어느 표현 방식이 적합한가 + 단일 frame family 의 재검증 필요성).
### 13.5 추가 / 분리 / 폐기 기준
| 행위 | 기준 | 본 차수 결정 |
|---|---|---|
| **variant 추가** | 같은 family 안 frame 추가 시 (예 : 18 미변환 frame 변환 후) — 기존 variant 흡수 가능 vs 새 variant 필요 | 기준만 정의, 실제 추가는 사용자 승인 |
| **family 분리** | variant 가 family 의 시각 정체성을 깨뜨리는 수준일 때 — variant 흡수 보다 family 분리 후보 (§ 13.2 핵심 원칙) | 기준만 정의, 실제 분리는 사용자 승인 |
| **variant 폐기** | 32 frame 전체 변환 후 사용 안 되는 variant 발견 시 | 폐기 보류, 재검증 후 결정 |
→ Phase Z 절대 룰 *"기존 templates 삭제 / 교체 실행 X"* + *"새 family CSS 파일 생성 X"* 와 정합.
### 13.6 Variant Model 이 결정하지 않는 것
Skeleton § 4.7 의 "결정 안 함" 확장 + 본 5d 추가 :
- ❌ 실제 class / data attribute / parameter 이름 (구현 영역)
- ❌ family 분리 / 통합 *최종 결정* (사용자 승인 영역)
- ❌ variant CSS / Jinja2 구현 (→ Family CSS § 8 / Jinja2 § 9 의 *구현*)
- ❌ AI 가 variant 선택 / 추가 / 변경 (Phase R' 회귀 방지 — 룰 2)
- ❌ Jinja2 parameter 이름 (구현 영역)
- ❌ token 자체 (→ Token Resolution § 4.5 / § 11)
- ❌ asset 자체 (→ Asset Policy § 4.6 / § 12)
- ❌ fallback 정책 (→ Fallback Behavior § 4.8, 5e)
- ❌ HTML / CSS / Jinja2 syntax (→ § 8 / § 9)
---
### 5d 차수 자체 점검 (작성 후)
- ✅ Variant Model 영역만 다룸 (Token / Asset / Fallback / Jinja2 / Family CSS 구현 / AI 침범 X)
- ✅ § 8.3 의 4 표현 방식 후보 표 redescription 0 — *selection criteria* perspective 만
- ✅ § 8.2 의 11 family 표 redescription 0 — *관리 perspective*
- ✅ Frame Inventory `Notes` variant meta redescription 0 — cross-reference 만
- ✅ 룰 1 (frame 별 CSS X / family 수렴 장치) + 룰 2 (variant 선택은 코드/catalog, AI X) 섹션 머리 명시
- ✅ § 13.2 핵심 원칙 callout — "family 를 억지로 유지하기 위한 장치 X"
- ✅ § 13.5 추가 / 분리 / 폐기 모두 사용자 승인 영역
- ✅ § 13.6 boundary 9 항목 + 5e dedicated 영역 cross-reference
---
## 14. Fallback Behavior — 5e 본격 설계
> ⚠️ **룰 1 — Fallback Behavior 는 Zone Catalog status 라벨 진입 후의 *동작 정책* 이다.**
>
> status 결정 자체는 § 7 의 책임, 본 § 14 는 *진입 후 동작* 만 다룬다.
> ⚠️ **룰 2 — fallback 중 AI 호출은 *zone content 조정 AI* 다.**
>
> 레이아웃 / family / variant / status 결정은 AI 영역이 아니다.
> ⚠️ **룰 3 — 레이아웃 회귀는 Zone Catalog status 변경으로만 트리거한다.**
>
> AI / Jinja2 가 직접 레이아웃을 변경하지 않는다.
### 14.1 Fallback Behavior 의 역할
Fallback Behavior 는 다음을 책임진다 :
1. **Zone Catalog status 라벨 진입 후의 동작 정책**`fallback_candidate`, `review_required` 가 어떻게 처리되는가
2. **5 차 Fallback 단계의 catalog / runtime 책임** — IMPROVEMENT-REDESIGN.md 의 fallback 흐름 안에서 본 설계가 넘겨야 할 상태와 경계
3. **fallback 중 AI 호출 boundary** — § 10 의 룰을 fallback context 에서 재확인
4. **레이아웃 회귀 트리거** — Phase Z 절대 룰 ("콘텐츠 줄이지 X, 그릇 변경") 의 catalog 단위 메커니즘
받는 입력 :
- Zone Catalog (§ 7.4) 의 6 status 라벨 (특히 `fallback_candidate`, `review_required`)
- IMPROVEMENT-REDESIGN.md 의 5 차 Fallback 흐름
→ Fallback Behavior = **status 진입 후 동작 정책 정의**. status 결정 / AI 호출 자체 / HTML 조립 / 레이아웃 결정은 본 차수 X.
### 14.2 fallback_candidate 진입 후 동작
`fallback_candidate` (§ 7.4 매트릭스의 low confidence cells) 진입 후의 catalog 단위 동작 :
| 동작 | catalog / runtime 책임 |
|---|---|
| zone 단위로 Fallback Behavior 흐름 진입 | catalog 가 status 부여, fallback 단계는 IMPROVEMENT-REDESIGN.md 5 차 따름 (§ 14.4) |
| 다른 family / 다른 frame 후보 검색 | catalog 의 재매칭 룰 (구체 알고리즘은 매칭 시스템 V1~V4 영역) |
| 레이아웃 회귀 트리거 검토 | § 14.6 의 절차 |
| AI 호출 (4 차 fallback 에서) | § 14.5 의 boundary 적용 |
> 🔒 **`fallback_candidate` 는 AI 에게 레이아웃을 묻는 신호가 아니다.**
>
> AI 호출이 fallback 흐름 중 발생하더라도, AI 의 활동 반경은 *zone content 조정* 까지만. 레이아웃 / family / variant / status / 새 frame 결정은 모두 코드 / catalog 영역.
### 14.3 review_required 진입 후 동작
`review_required` (§ 7.4 의 모든 medium confidence cells) 진입 후 :
| 동작 | catalog / runtime 책임 |
|---|---|
| review payload 분리 + marker 부착 | runtime (Jinja2 § 9.4) |
| 사용자 검토 큐 진입 | 파이프라인 / 구현 영역 (catalog 책임 X) |
| 검토 결과 반영 | 사용자 결정 → catalog 가 status 변경 (예 : `matched_zone` 으로 승격 또는 `fallback_candidate` 로 강등) |
→ review 흐름 자체는 파이프라인 / 구현 영역. catalog 는 status 변경 인터페이스만 제공.
### 14.4 5 차 Fallback 단계 (cross-reference)
5 차 Fallback 단계 (1 차~5 차) 흐름은 [`IMPROVEMENT-REDESIGN.md`](../../IMPROVEMENT-REDESIGN.md) 의 fallback 흐름 따른다.
본 문서는 그 흐름 안에서 catalog / runtime 이 *넘겨야 할 상태와 금지 경계* 를 정의한다 :
- 1~3 차 fallback (코드만) — catalog 가 재매칭 / status 재부여
- 4 차 fallback (AI 콘텐츠 조정) — § 14.5 의 AI 호출 boundary 적용
- 5 차 fallback (단일 프리셋 강제) — § 14.6 의 레이아웃 회귀 절차
→ 5 차 단계의 *구체 알고리즘 / 임계값 / 호출 횟수* 는 IMPROVEMENT-REDESIGN.md + 구현 영역 (redescription X).
### 14.5 fallback 중 AI 호출 — § 10 룰 재확인
4 차 fallback (AI 콘텐츠 조정) 에서 AI 호출 발생 시, § 10 의 룰이 *그대로* 적용 :
- ✅ AI 입력 (§ 10.3) : `zone_meta`, `family_meta`, `mdx_excerpt`, `style_hint`, `layout_meta`
- ✅ AI 출력 (§ 10.3) : `zone.content.preview_text`, `zone.content.popup_full`, `zone.content.slot_payload`
- ❌ AI 출력 금지 (§ 10.4) : HTML / class / Jinja2 / family / variant / preset / 새 frame / status
> 🔒 **재확인 — fallback context 에서도 AI 의 호출 단위는 *zone 안 콘텐츠* 만.**
>
> *fallback_candidate 진입* 자체는 AI 호출 트리거가 아니다. AI 호출은 4 차 fallback 의 *콘텐츠 조정* 단계에서만 발생하며, 그때도 § 10 의 룰 (룰 1·2 + § 10.4) + § 9 의 룰 (룰 1·2 + § 9.5) = **5 면 차단** 그대로 작동.
### 14.6 레이아웃 회귀 — Zone Catalog 트리거
Phase Z 절대 룰 *"불일치 시 레이아웃 회귀 — 콘텐츠 줄이지 X, 그릇 변경"* 의 catalog 단위 메커니즘 :
| 단계 | 책임 |
|---|---|
| 회귀 트리거 감지 | catalog (§ 7) — status 분포 모니터링 (예 : 모든 zone 이 `fallback_candidate` / `review_required` 일 때) |
| 다른 layout preset 후보 검색 | catalog (§ 7.2-1 의 4 프리셋 중) |
| preset 변경 → zone 재구성 | catalog 가 새 preset 의 zone 구성 결정 (§ 7.2-2), runtime 이 재조립 (§ 9) |
| AI 호출 (있다면) | § 14.5 의 boundary — *콘텐츠 조정* 까지만, 새 layout 결정 X |
> 🔒 **원칙 — 레이아웃 회귀는 그릇 변경이다.**
>
> 콘텐츠, 텍스트, MDX 원문을 줄이지 않는다.
> AI 가 새 layout 을 만들지 않는다.
> 4 프리셋 `Type A / B / B' / B''` 안에서 다른 그릇을 선택한다.
### 14.7 Fallback Behavior 가 결정하지 않는 것
Skeleton § 4.8 의 "결정 안 함" 확장 + 본 5e 추가 :
- ❌ Zone Catalog status 라벨 *부여 자체* (→ § 7.4)
- ❌ AI 호출 자체 / AI 모델 / 프롬프트 / 호출 빈도 (→ § 4.4 / § 10 + 구현 영역)
- ❌ Jinja2 의 status 별 조립 인터페이스 (→ § 9.4)
- ❌ Family CSS 의 fallback 스타일링 (→ § 8 / § 4.2)
- ❌ token 자체 (→ § 11)
- ❌ asset 자체 (→ § 12)
- ❌ variant 자체 (→ § 13)
- ❌ 5 차 Fallback 의 구체 알고리즘 / 임계값 / 호출 횟수 (→ IMPROVEMENT-REDESIGN.md + 구현 영역)
- ❌ review 흐름의 사용자 검토 UX / 큐 메커니즘 (→ 파이프라인 / 구현 영역)
- ❌ 새 layout preset 추가 / 폐기 — 4 프리셋 안에서만 분기 (자유 디자인 금지)
---
### 5e 차수 자체 점검 (작성 후)
- ✅ Fallback Behavior 영역만 다룸 (status 부여 / AI 호출 자체 / Jinja2 조립 / Family CSS / token / asset / variant 침범 X)
- ✅ § 7.4 6 status 매트릭스 redescription 0 — *진입 후 동작* perspective 만
- ✅ § 9.4 status 별 조립 인터페이스 redescription 0
- ✅ § 10 AI Boundary 룰 redescription 0 — fallback context 의 *재확인*
- ✅ IMPROVEMENT-REDESIGN.md 5 차 Fallback 흐름 redescription 0 — § 14.4 짧은 cross-reference + 책임 perspective
- ✅ 룰 1 (status 진입 후 동작) + 룰 2 (AI = zone content 조정) + 룰 3 (레이아웃 회귀 = catalog 트리거) 섹션 머리 명시
- ✅ § 14.2 callout — "`fallback_candidate` 는 AI 에게 레이아웃 묻는 신호 X"
- ✅ § 14.5 callout — fallback context 에서도 AI = zone 콘텐츠만
- ✅ § 14.6 callout — "레이아웃 회귀는 그릇 변경" (Phase Z 절대 룰 prominent)
- ✅ § 14.7 boundary 10 항목 + 모든 dedicated 영역 cross-reference
---
## 15. 통합 검증 — 6 차
> 본 섹션은 1~5e 차수 결과의 *검증* 만 다룬다. 새 설계 없음, 기존 결정의 무결성 + Phase Z-2 진입 준비 판단만.
> 발견된 이슈는 § 15.4, Phase Z-2 진입 준비 판정은 § 15.5.
### 15.1 검증 방법
검증 도구 :
- **grep** — 패턴 기반 무결성 / 표현 위반 탐지 (cross-reference, AI 결정 표현, legacy 재사용 표현 등)
- **의미 검토** — boundary 충돌 / 톤 / 후보 vs 확정 구분 (grep 만으로 잡히지 않는 경계 표현)
검증 항목 (8 개) :
| 항목 | 내용 | 도구 |
|---|---|---|
| 0 | cross-reference 무결성 | grep + 매칭 |
| 1 | 8 책임 영역 boundary 충돌 없음 | 의미 검토 |
| 2 | AI 가 layout / preset / family / variant / HTML 결정 표현 없음 | grep + 의미 |
| 3 | Type A / B / B' / B'' 선택이 코드 / catalog 책임으로 일관 | grep + 의미 |
| 4 | fallback 이 AI layout 요청처럼 읽히지 않음 | 의미 검토 |
| 5 | token / asset / variant *후보* 가 구현 확정처럼 읽히지 않음 | grep + 의미 |
| 6 | legacy `templates/blocks` runtime 재사용처럼 읽히는 표현 없음 | grep + 의미 |
| 7 | Phase Z-2 구현 전 보류 항목이 명확함 | grep + 의미 |
사전 분기 룰 (§ 15.2 결과에 따른 § 15.3 진행 방식) :
| broken 수 | 처리 |
|---|---|
| 0 개 | 그대로 § 15.3 진행 |
| 1~2 개 | 즉시 수정 → § 15.3 진행, § 15.4 에 "non-blocker, 수정 완료" 기록 |
| 3~4 개 | 수정 후 진행, § 15.5 에 "minor drift 발견 / 수정" 명시 |
| 5 개+ | § 15.3 은 현재 상태로만 수행, § 15.5 에 "기준선 흔들림" 명시 |
severity 라벨 (§ 15.4) :
| 라벨 | 의미 |
|---|---|
| `blocker` | Phase Z-2 진입 전 반드시 해결 |
| `non-blocker` | Phase Z-2 진입 가능, 후속 정리 |
### 15.2 cross-reference 무결성
문서 내 § 패턴 매칭 결과 :
- **참조 추출** — § 4.1 ~ 4.8, § 7 / 7.1 / 7.2-1 / 7.2-2 / 7.3 / 7.4 / 7.5, § 8 ~ 14 의 모든 `N.M` 패턴 (50+ 회 인용)
- **실제 섹션 매칭** — 모든 인용이 실제 섹션 (`##` / `###` / `####`) 으로 해석됨. § 7.2-1 / 7.2-2 (sub-subsection) 도 실제 `####` 헤딩 존재 (line 214 / 229)
- **broken 수** — **0 개**
→ § 15.1 분기 룰의 "0 개" 케이스. 그대로 § 15.3 진행.
### 15.3 7 항목 검증 결과
| 항목 | 결과 | 근거 (대표 line) |
|---|---|---|
| 1. 8 영역 boundary 충돌 없음 | ✅ PASS | 각 영역의 "X 가 결정하지 않는 것" 섹션 (§ 7.5 / 8.6 / 9.6 / 10.6 / 11.6 / 12.6 / 13.6 / 14.7) 이 다른 영역 dedicated section 으로 cross-reference. 침범 표현 0. |
| 2. AI 가 layout / preset / family / variant / HTML 결정 표현 없음 | ✅ PASS | line 47, 99, 552, 587, 617, 659, 1049, 1111, 1147 — 모두 *금지* 또는 *Phase R' 회귀 방지* 맥락. 결정 표현 0. |
| 3. Type A / B / B' / B'' = 코드 / catalog 책임 일관 | ✅ PASS | line 47 ("코드만"), 196 ("catalog 가 결정"), 225, 480, 587, 617, 1158, 1181 — 모두 catalog 또는 "AI X" 로 일관. |
| 4. fallback ≠ AI layout 요청 | ✅ PASS | line 291, 1111 (🔒), 1147 (🔒), 1149, 1162 (🔒) — 명시적 callout. fallback_candidate 진입 ≠ AI 호출 트리거 명시. |
| 5. token / asset / variant *후보* ≠ 구현 확정 | ✅ PASS | "후보" 59 회 사용, 모두 working name / 후보 상태. line 737 ("아직 확정 X"), 785, 904, 993, 1038, 1066 — "Phase Z-2 구현 진입 시 사용자 승인" 패턴. |
| 6. legacy `templates/blocks` runtime 재사용 표현 없음 | ✅ PASS | line 48 ("legacy blocks runtime reuse X ... 참고만"), 159 / 162 / 433 — 삭제 보류 + runtime 재사용 X 명시. |
| 7. Phase Z-2 보류 항목 명확 | ✅ PASS | line 3, 20, 158, 181, 737, 785, 904 + "(구현 영역)" 태그 17 회 — Phase Z-2 입력 문서 위치 명확, 보류 항목 sweep 가능. |
**7 항목 모두 PASS**.
### 15.4 발견된 이슈
| 이슈 | severity | 처리 |
|---|---|---|
| (없음) | — | — |
→ blocker / non-blocker 모두 0 건. 검증 결과 깨끗.
### 15.5 Phase Z-2 진입 준비 상태
| 항목 | 상태 |
|---|---|
| 1~5e 차수 본격 설계 | ✅ 완료 |
| cross-reference 무결성 | ✅ broken 0 (§ 15.2) |
| 7 항목 boundary / 회귀 방지 | ✅ 7/7 PASS (§ 15.3) |
| 발견된 issue | ✅ 0 건 (§ 15.4) |
| Phase Z-2 입력 문서 위치 | ✅ 명확 (§ 1 / § 6) |
**판정** : Phase Z-2 진입 *기준선 (설계 baseline)* 준비됨.
> 🔒 **Phase Z-2 진입 준비는 *구현 시작 승인이 아니다*. 구현 착수는 별도 사용자 승인 후 진행한다.**
---
## 16. Phase Z-2 MVP-1 scaffold 허용 규칙
> 본 섹션은 § 15 통합 검증 완료 후 추가된 *구현 규칙*. Phase Z-2 MVP-1 이 HTML 출력을 위해 필요한 *실행 껍데기 (scaffold)* 의 허용 범위 + 종료 조건 명시.
> *예외* 가 아닌 *원칙 안의 허용 규칙* — legacy 재사용 X / 정식 family 확정 X 는 그대로 유지.
### 16.1 배경 — 왜 필요한가
Phase Z-2 MVP-1 은 :
- legacy `templates/blocks/structures/*` runtime 재사용 X (§ 1, line 48)
- 신규 token / asset / variant / Family CSS *확정* 보류 (§ 11.5 / 12.5 / 13.5)
→ 실제 HTML 렌더링을 위해서는 *얇은 실행 껍데기* 가 필요. 이를 *원칙 안의 허용 규칙* 으로 정의한다.
### 16.2 핵심 경계
| 항목 | 상태 |
|---|---|
| legacy runtime 재사용 | ❌ 금지 (기존 룰 유지) |
| 정식 Family CSS *확정* | ❌ 보류 (§ 11.5 / 12.5 / 13.5 유지) |
| MVP 출력용 scaffold | ✅ 허용 (본 § 16 의 룰 내) |
### 16.3 scaffold 허용 룰
| 룰 | 내용 |
|---|---|
| 위치 | `templates/phase_z2/` (별도 디렉토리. 기존 `templates/blocks/` 와 분리) |
| 마커 | 각 scaffold 파일 상단에 1 줄 주석 필수 :<br>`<!-- Phase Z-2 MVP-1 scaffold — MVP-2 이후 정식 Family CSS partial 로 대체. legacy structures/* 는 stylization 참고만. -->` |
| 토큰 | 기존 token 만 참조. 신규 token 추가 X |
| 자산 | 기존 asset 만. 신규 asset 추가 X |
| variant | § 8.2 의 11 family 후보 안에서만. 신규 variant 추가 X |
| legacy 파일 import | ❌ 금지. legacy `templates/blocks/structures/*.html`*stylization 참고만*, 직접 import / include / extend X |
| 시각 디자인 도출 | frame 메타 + Figma 좌표 + 기존 token 으로 *수학적 도출*. legacy 시각 모방 우회 금지 |
### 16.4 종료 조건
scaffold 의 수명 = *MVP-1 ~ MVP-2 직전* :
- **MVP-1** : scaffold 로 HTML 출력
- **MVP-2** : 정식 Family CSS partial 로 *대체*. `templates/phase_z2/` 디렉토리 삭제 또는 정식 위치로 이동
- **종료 조건** : MVP-2 entry 시 본 § 16 의 scaffold 룰 *무효화*
> 🔒 **scaffold 는 *실행 껍데기* 이지 *디자인 확정* 이 아니다.** MVP-2 에서 정식 Family CSS partial 로 대체하지 않으면 scaffold 가 *영구화* 되는 위험. MVP-2 진입 시 — *§ 16 무효화 + scaffold 삭제 + Family CSS 확정* = **3 동시 조건**.
### 16.5 cross-reference
- § 1 line 48 — legacy runtime reuse X (유지)
- § 8 — Family CSS 정식 확정 보류 (유지)
- § 11.5 / 12.5 / 13.5 — 신규 token / asset / variant 보류 (유지)
- § 15.5 — Phase Z-2 진입 준비 상태 (본 § 16 은 진입 후 *구현 시* 적용)
- § 17 — MVP-1 결과 (mvp1_test5: visual fidelity FAIL) 에 따른 *방향 전환*. scaffold polish 중단, frame-derived partial promotion 으로 진화
---
## 17. Frame-derived Partial Promotion — MVP-1.5+
> 본 섹션은 § 16 *scaffold 허용 룰* 의 **방향 전환**. MVP-1 progression (mvp1_test2 ~ mvp1_test5) 에서 발견된 사실 — *scaffold 가 V4 매칭한 frame 의 실제 변환물을 대체하지 못함* — 에 따른 진화. scaffold polish 는 중단, frame-derived partial promotion 으로 전환.
### 17.1 배경 — MVP-1 progression (교훈 보존)
| run_id | 결과 | 교훈 |
|---|---|---|
| mvp1_test2 | data chain 동작, raw dump 발견 | mapper output 이 slot 모양이어야 함 (raw section dump X) |
| mvp1_test3 | data PASS, visual FAIL (overflow + slide-base contract 미충족) | "기술 chain PASS ≠ MVP PASS". 시각 게이트 필수 |
| mvp1_test4 | overflow check PASS, 내부 clipping 미검출 | `overflow:hidden` 은 안전장치. 진짜 게이트는 Selenium *내부 clipping* 검출 |
| mvp1_test5 | runtime PASS, **visual fidelity FAIL** | **scaffold polish 한계** — V4 가 고른 frame 의 *실제 변환물* 을 runtime 이 안 쓰면 visual fidelity 못 나옴 |
**방향 전환** : scaffold polish 중단. **frame-derived partial promotion** 으로 진화.
### 17.2 § 16 scaffold vs § 17 promotion
| 항목 | § 16 scaffold | § 17 frame-derived partial |
|---|---|---|
| 출처 | 코드에서 직접 작성 (token + 색 추정) | `figma_to_html_agent/blocks/{id}/index.html` (1:1 Figma 변환물) |
| 시각 fidelity | 근사 | Figma 와 1:1 (정확한 색 / 비율 / 구조) |
| Templating | `{{ slot_payload.* }}` | `{{ slot_payload.* }}` (동일) |
| 위치 | `templates/phase_z2/frames/` | `templates/phase_z2/families/` |
| 사용 범위 | *frame 미변환 시 임시* — 변환 완료 시 즉시 § 17 partial 로 대체 | *변환 완료된 frame* 에 대한 정식 runtime partial |
### 17.3 Promotion 규칙
| 룰 | 내용 |
|---|---|
| Source | `figma_to_html_agent/blocks/{frame_id}/index.html` (1:1 변환물 *필수*) |
| Target | `templates/phase_z2/families/{template_id}.html` |
| 변환 방식 | **templating** — index.html 의 *구조 / CSS / 색 / 비율* 유지, 텍스트만 `{{ slot_payload.* }}` 로 치환 |
| 단순 복사 | ❌ 금지 — runtime 에서 V4 매칭한 콘텐츠 못 받음 |
| 1:1 변환물 없는 frame | 변환 먼저 (figma_to_html_agent 영역, *별도 작업 + 사용자 승인 필수*) |
| 마커 | partial 파일 상단에 :<br>`<!-- Phase Z-2 frame-derived partial — derived from figma_to_html_agent/blocks/{id}/index.html. MVP-2 family CSS 확정 시 대체. -->` |
### 17.4 § 16 scaffold 와의 관계
- § 16 scaffold = *frame 미변환 시 임시 처리* 로만 허용 (변환물 없는 frame)
- 변환 완료 시 즉시 § 17 partial 로 대체. scaffold 는 폐기
- legacy `templates/blocks/structures/` runtime 재사용 X 는 **그대로 유지** (§ 1 line 48)
### 17.5 종료 조건
partial 의 수명 = *MVP-1.5 ~ MVP-2 직전*. MVP-2 에서 정식 Family CSS 확정 시 :
- partial 위치 (`templates/phase_z2/families/`) → 정식 family CSS 위치로 이동 / 통합
- § 17 룰 무효화
> 🔒 **partial = *frame-derived 정확한 산출물* 이지만 *family CSS 확정* 은 아니다.** MVP-2 에서 정식 family 로 통합하지 않으면 partial 이 *영구화* 되는 위험. § 16 scaffold 와 동일한 lifecycle 관리 필요.
### 17.6 cross-reference
- § 16 — scaffold 허용 룰 (MVP-1 한정, 미변환 frame 임시 처리)
- § 8 — Family CSS 정식 확정 (MVP-2 종료 시점)
- § 11.5 / 12.5 / 13.5 — 신규 token / asset / variant 보류 (유지)
---