# yt9 공통 시각 레이어 — 회사 원본 조사

조사일: 2026-10-01. 이 문서는 원본 코드와 계약을 읽은 결과 및 통합 설계안이다. 원본 스킬·회사 저장소·배포 환경을 수정하지 않았다. 렌더러 실행·유료 생성·npm 설치는 하지 않았다.

## 먼저 확인된 결론

하나의 사용자 화면과 하나의 타임라인 계약을 만들고, 기존 렌더러를 어댑터로 연결하는 방식이 적합하다. 모든 영상을 한 그래픽 엔진으로 다시 만드는 방식은 실제로 다른 입력·시간·출력을 불필요하게 변환한다.

- **yt8:** V/I/L/E/C/P/Y/M 8개 클립 타입이 실제 존재한다. M은 지도 점·라벨·원형 지역 사진 인셋을 순차 공개하는 컷이다. 기존 코드는 지도 경로 비행이나 실제 지리 타일 카메라 엔진이 아니다.
- **회사 Remotion:** `remotion-edit`에는 프레임 기반 텍스트·이미지 등장 12종, 카메라 3종, 슬라이드 전환 4종, Prezi 이동 2종, 기존 전체 씬 효과 5종, 데이터 요소 4종, 스타일 9종이 있다.
- **WP 도해:** `wp4` main에서는 Excalidraw/roughjs/도해 렌더러를 찾지 못했다. 실제 원본은 회사의 **`wp3-origin`** 에 있다. 구 Excalidraw 형식을 현재 **아이콘·라벨·중첩 구성 JSON → 결정론 SVG → 순차 그리기**로 대체했다. 기존 컴포넌트는 roughjs나 Excalidraw 라이브러리를 사용하지 않는다.
- **가장 재사용 가치가 높은 코드:** WP3의 SVG 도해 그리기 함수와 모션 스택 계산은 편집기 미리보기·Remotion 출력에서 이미 같은 원천을 공유한다. 이를 별도 공통 패키지로 옮겨 yt9에서도 소비하면 미리보기와 출력의 차이를 줄일 수 있다.

`company-motion-catalog.json`은 원본 확인 항목 **82개**를 담는다. yt8 22개, Remotion 39개, WP 21개다. 이는 서로 다른 **클립 타입·효과 변형·스타일·카메라 모드**를 포함한 인벤토리 수이며, 82개의 동일한 수준의 독립 모션 엔진이라는 뜻은 아니다. 외부 주문 예시 88종과도 의미 단위가 다르다.

`capability: source-verified`는 **소스가 존재하고 읽어 확인했다**는 뜻이다. 브라우저 샘플의 `preview_capability: family-preview`는 공통 데모로 해당 시각 계열을 보여준다는 뜻이다. 실제 엔진 어댑터 완료·프로덕션 출력 완료로 표시하면 안 된다.

## 원본 고정점

| 대상 | 조사한 커밋 | 읽은 핵심 원본 |
|---|---|---|
| `gltr-company/moondo-plugins` | `c34140b056bf80583eeb1d74e6a03c836ead6552` | `skills/yt8/scripts/{init,maps,photos,ysk,effects,card,render,animate,lipsync}.py`, `skills/yt8/{SKILL,MANUAL}.md` |
| `gltr-company/remotion-edit` | `45d2213bf4f709a671ef713065b37435f4f5afef` | `src/{Root,Short,LayerElement,DataViz,AudioViz,SlideMode,ScrollMode,sceneConfig,schema}.tsx/ts`, `src/styles/*.json`, `scripts/render.mjs` |
| `gltr-company/wp4` | `210e8f2de73dff72658c1d0a0444a9da49f9a5ff` | `backend/app/assembly.py`, `canon/contracts/final-video-assembly.md`, `prototypes/scene-workbench/package.json`, 전체 소스 검색 |
| `gltr-company/wp3-origin` | `ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4` | `frontend/src/shared/api/sceneDiagram.ts`, `frontend/src/entities/editor/lib/scene-diagram-{svg.ts,layout.mjs}`, `remotion-renderer/src/SceneDiagramLayer.jsx`, `remotion-renderer/src/effects/{scene-diagram-draw,registry,svg-filters}.mjs`, `backend/app/contexts/generation/scene_diagram/*` |

yt8 조사 대상 그래픽 파일은 위 로컬 커밋과 같았다. 별도 작업의 YouTube 업로드 파일 변경은 이 조사에 포함하지 않았다. WP4/WP3의 `AGENTS.md`, 관련 canon·QA 인덱스를 읽었으며 저장소 구현을 수행하지 않았다.

GitHub 참조는 원본 접근 권한이 있는 회사 구성원이 확인할 수 있다. 공개 샘플에는 이름·동작·지원 입력·커밋과 경로 등 메타데이터만 전달하고, 원본 전체·실제 프로젝트 자산·비밀값을 번들에 넣지 않는다.

## yt8 타입과 실제 구현

| 타입 | 실제 역할 | 입력 | 출력과 시간 | 통합할 위치 |
|---|---|---|---|---|
| V | 생성 이미지 → H3 또는 명시 선택 Kling 영상 | 시드 이미지, motion prompt, provider, 영상 길이 | provider MP4, 최종 30fps 정규화 | 배경 자산 provider 어댑터 |
| I | 이미지 컷 | image path, hint, 시작·끝 | PNG + 최종 FFmpeg zoompan, 30fps | 이미지 레이어 |
| L | 검토 음성과 exact-audio 립싱크 | start_sec/end_sec, 이미지, 음성 구간 | H3 MP4. 음성 속도 보존, 짧으면 끝 프레임 보충 | 음성 고정 영상 레이어 |
| E | 텍스트·이미지 효과 영상 | effect DSL, quoted text, 옵션, duration_sec | Pillow/FFmpeg MP4, 30fps | EAdapter로 컷 단위 생성 후 삽입 |
| C | 인용·메시지·통계 카드 | title/body/sub, card_style, optional card render settings | PNG/MP4. 일부 카드 줌 설정 있음 | 카드 레이어 또는 기존 카드 MP4 |
| P | 자료 사진 수집·합성 | query/sources/count, layout, effect, position, local_paths | 자료·출처 메타데이터, canvas PNG, optional stack MP4 | 자료 선택·합성 레이어 |
| Y | 키네틱 사진·텍스트 | text/local_paths/count/motion | asset_plan.json + motion_timeline.json + MP4, 30fps | 기존 YSKAdapter |
| M | 지도 위치 설명 | map_path/map_prompt, places, bounds, reveal | 점·연결선·말풍선·원형 인셋 PNG/MP4, **24fps** | MapAdapter |

원본: [yt8 타입 초기화](https://github.com/gltr-company/moondo-plugins/blob/c34140b056bf80583eeb1d74e6a03c836ead6552/skills/yt8/scripts/init.py), [지도](https://github.com/gltr-company/moondo-plugins/blob/c34140b056bf80583eeb1d74e6a03c836ead6552/skills/yt8/scripts/maps.py), [YSK](https://github.com/gltr-company/moondo-plugins/blob/c34140b056bf80583eeb1d74e6a03c836ead6552/skills/yt8/scripts/ysk.py).

### E 타입 10개

`sequential`, `colored`, `flash`, `heartbeat`, `fade`, `text_reveal`, `closein`, `closeout`, `title_card`, `rapid_sequence`.

기존 자연어 `comment → effect` 변환 함수는 있다. 다만 문자열 DSL로 출력하며 호출 프롬프트의 노출 목록이 실제 핸들러 10개와 일치하지 않는다. 공통 화면에서는 DSL을 사용자에게 입력하게 하지 말고, 검증된 JSON 파라미터를 어댑터가 DSL 또는 함수 인자로 바꿔야 한다.

`rapid_sequence`는 items[].kind=image/video, fit=cover/contain/fill, transition=cut/flash/dip, motion=none/zoom_in/zoom_out, slot_duration 또는 항목별 duration, flash_duration, pre_flash/post_flash, audio=drop/keep를 처리한다. 이는 세그먼트 사이 전환과 별개로 **한 E 클립 내부의 몽타주**다.

원본: [E 핸들러와 파서](https://github.com/gltr-company/moondo-plugins/blob/c34140b056bf80583eeb1d74e6a03c836ead6552/skills/yt8/scripts/effects.py).

### Y와 P

Y에서 확인한 motion 변형은 `cross_slide_pair`, `carousel_orbit`, `stacked_memory`다. 이미지 한 장이면 soft bottom slide + subtle_float를 사용한다. 텍스트는 glow reveal + float + fade/blur다. 실제 구현은 `youtube-shorts-kinetic/scripts/render_ysk.py`라는 형제 스킬 렌더러에 의존한다. yt8/ysk.py만 복사해서는 실행되지 않는다.

P의 stack은 사진 1장, 2장, 3장이 쌓인 각각의 정지 합성 프레임을 차례로 MP4로 만든다. 각 단계 최소 길이가 0.4초여서 요청 총 길이가 아주 짧을 때 합계가 초과할 수 있다. 공통 compiler가 총 프레임을 먼저 확정하고 어댑터가 길이 일치를 검증해야 한다.

### M 지도

places[].xy는 정규화 좌표이고 lat/lon + bounds=[west,south,east,north]를 넣으면 좌표로 변환한다. 이름만 있을 때 일부 내장 지명 좌표를 쓰며, 그 외에는 보기용 위치를 분배한다. 배경이 없으면 생성 시도 또는 양피지 fallback이다. fallback은 **지리적으로 검증된 지도·좌표라는 뜻이 아니다**.

따라서 실제 장소의 이동·거리·정치적 경계를 설명할 때는 승인한 map asset와 좌표 데이터를 사용해야 한다. UI 데모의 route line은 M의 확장 제안이지 원본 M이 이미 경로 선을 애니메이션하는 기능이라고 쓰면 안 된다. 기존 map_sources의 photos 값이 있다고 해서 해당 모듈이 사진 지도 검색을 실제 실행하는 것은 아니다.

## 회사 Remotion

실제 Composition은 `Short` 하나이고 JSON 씬 설정을 입력으로 소비한다. `Root.tsx`가 calculateMetadata에서 전체 길이를 계산한다. 각 씬은 `sec`, `bg`, `text/sub/image`, `elements[]`, 선택적 voice, camera/world 좌표, group transforms를 가진다.

### 원본 항목

| 분류 | 검증된 값 | 소스 |
|---|---|---|
| 레이어 등장 | none, fade, slide, scale-pop, blur-in, bounce, typewriter, ken-burns, word-by-word, shake, pulse-glow, wobble | `src/LayerElement.tsx` |
| 카메라 | prezi, slide, scroll | `src/{Short,SlideMode,ScrollMode}.tsx` |
| 슬라이드 전환 | fade, slide-left, slide-up, cut | `src/SlideMode.tsx` |
| Prezi 이동 | pull-back, dive; optional flashIn/zoom blur | `src/Short.tsx` |
| 전체 씬 기존 프리셋 | plain, float, typewriter, tilt, cardstream; elements 존재 시 미사용 | `src/Short.tsx` |
| 데이터 | counter, barchart, audioviz-bars, audioviz-wave | `src/{DataViz,AudioViz}.tsx` |
| 스타일 | ai-story, audiogram, data-pop, dont-blink, kinetic-bold, neon-tech, ppt-clean, prezi-dawah, story-soft | `src/styles/*.json` |

원본: [레이어](https://github.com/gltr-company/remotion-edit/blob/45d2213bf4f709a671ef713065b37435f4f5afef/src/LayerElement.tsx), [데이터](https://github.com/gltr-company/remotion-edit/blob/45d2213bf4f709a671ef713065b37435f4f5afef/src/DataViz.tsx), [오디오](https://github.com/gltr-company/remotion-edit/blob/45d2213bf4f709a671ef713065b37435f4f5afef/src/AudioViz.tsx), [타입·시간 단위](https://github.com/gltr-company/remotion-edit/blob/45d2213bf4f709a671ef713065b37435f4f5afef/src/sceneConfig.ts).

### 입력과 시간

- enter.delay=0, enter.dur=14는 **프레임** 단위다. typewriter speed=0.7는 글자/프레임이다.
- counter는 from=0, to=100, duration=40프레임, enter.delay를 사용하며 prefix/suffix/separator/decimals를 제공한다.
- barchart는 bars[{label,value,color}], orientation=vertical/horizontal, duration=30프레임, enter.delay를 사용한다. 음수값을 표현하는 양·음 차트는 별도 설계가 필요하다.
- audioviz는 실제 audio src를 분석한다. fake animation을 오디오 분석 완료로 표시하면 안 된다. 현재 시각화는 전역 frame을 사용하므로 여러 씬에서 각기 별도 음성을 쓰는 경우 clip 상대 오디오 offset 처리를 어댑터에서 검토해야 한다.
- prezi/slide는 각 sec × fps 반올림 프레임에 씬 간 moveFrames를 더한다. scroll은 씬 sec 합 × fps의 연속 스크롤이다. 기존 음성 타임라인 위에 전환 길이를 추가하면 뒤 씬이 밀린다. 공통 compiler가 전환이 구간에 포함되는지 먼저 확정해야 한다.

현재 `scripts/render.mjs`는 입력 검증 뒤 `src/scenes.json`을 백업·교체하고 렌더 후 복구한다. 동시 렌더 요청에서 같은 파일을 공유하면 경합한다. 사이트의 렌더 worker에서는 이 스크립트를 병렬 공유하지 말고 **각 작업의 입력 JSON을 props로 넘기는 bundle + renderMedia**, 또는 작업마다 격리된 디렉터리를 사용한다. 재사용 후보인 프레임 기반 컴포넌트 자체는 이 문제와 별개다.

## WP3의 실제 도해와 효과 레이어

### 구 Excalidraw와 현재 계약을 구분

2026-07-10 설계 문서는 Excalidraw elements와 exportToSvg를 다룬다. 하지만 현재 코드와 뒤의 문서는 이 구성을 아이콘 composition으로 대체했다고 명시한다. 이전 설계의 rectangle/ellipse/arrow JSON을 현재 구현 계약으로 제시하면 잘못된 통합이 된다.

현재 SceneComposition은 title, elements, captions다. element는 icon, label, color, children을 가지며 **독립 edge 그래프 계약이 없다**. 과거 좌표 x/y/w/order는 호환 입력으로 수용하나 현재 새니타이즈·배치는 이를 사용하지 않는다.

서버 sanitize는 총 요소 24개(중첩 포함), 3단(root/child/grandchild), 라벨 60자, title 60자, captions 120자 × 4줄로 제한한다. 알 수 없는 아이콘은 라벨만 있는 상자로 보존하며 의미가 전혀 없는 요소는 버린다. core Lucide vocabulary를 프롬프트와 sanitize에서 공유한다.

자연어 생성 입력은 direction_text, dialogue_text, user_hint, aspect_ratio다. 단계는 **한국어 그림계획 → composition JSON → sanitize**이며 JSON 실패는 기본 1회 재시도한다.

원본: [현재 API 계약](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/frontend/src/shared/api/sceneDiagram.ts), [생성](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/backend/app/contexts/generation/scene_diagram/scene_diagram_llm.py), [sanitize](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/backend/app/contexts/generation/scene_diagram/scene_diagram_sanitize.py).

### SVG 배치와 seek 가능한 그리기

compositionToSvgString은 canvasForAspect와 layoutComposition으로 frame/chip/icon/title/label/caption을 배치한다. Lucide 도형은 path로 정규화한다. 화면비에 따라 가로 row(비율 > 1.3), 세로 column(< 0.77), 그 외 2열 grid를 선택하고 공간에 맞춰 축소한다. 한글 크기를 고려한 결정론 계산으로 LLM의 임의 좌표를 사용하지 않는다.

applyDrawProgress는 SVG의 path/text DOM 순서를 사용한다. path는 getTotalLength, text는 글자수 × fontSize × 0.35를 12~120에 제한한 가상 길이를 준다. 총 길이에 진행률을 곱해 앞 노드부터 완성시키고 path의 dashoffset, text의 opacity를 갱신한다. **클립 90%에 그림이 완성되고 마지막 10%는 읽는 시간**이다.

미리보기와 Remotion SceneDiagramLayer가 같은 draw 모듈을 가져온다. 프레임 f에서 clip 시작과 길이를 계산해 progress를 넣으면 임의 프레임으로 이동해도 같은 결과를 얻는다. 원본 full-canvas composition을 유지하면서 renderTarget으로 최상위 요소 하나만 그리는 레이어 분리 계약도 있다. 분리 시 각 요소를 새로 배치하면 픽셀 일치가 깨지므로 피해야 한다.

원본: [SVG 변환](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/frontend/src/entities/editor/lib/scene-diagram-svg.ts), [공유 draw 계산](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/remotion-renderer/src/effects/scene-diagram-draw.mjs), [Remotion export](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/remotion-renderer/src/SceneDiagramLayer.jsx).

### 효과 스택

WP3의 실제 모션 항목 10개는 effect_zoom, effect_move, effect_rotate, effect_shake, effect_anchor, effect_fade, effect_reveal, effect_blur, effect_glow, effect_brightness다. 텍스트 FX는 zoom_punch, black_flash, white_flash, shake, glitch, karaoke, typewriting, fade 8개다. Squigglevision와 Water Ripple은 프레임·seed에 따른 SVG 필터로 구현돼 있다.

composeStackedFrameStyle은 layer.effects[]의 transform/filter를 순서대로 합성하고 opacity를 곱하며 clipPath는 마지막 값을 사용한다. position·local transforms를 구분해 회전이 이동 벡터를 의도 없이 돌리지 않도록 한다. startSec, motionEndSec 또는 durationSec/motionDur와 속성별 keyframes를 해석한다. preview와 renderer가 frontend/src/shared/effects의 계산을 공유한다.

**그래서 하나의 레이어에 '왼쪽에서 들어오고, 살짝 커지고, 마지막에 흐려져라'를 적용할 기반이 이미 있다.** 현행 WP4에 이 코드가 있다고 말하는 대신 WP3의 검증된 효과 계산을 yt9 adapter에 가져오는 작업을 명시해야 한다.

원본: [스택 계산](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/remotion-renderer/src/effects/registry.mjs), [텍스트 목록 원천](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/frontend/src/shared/effects/text-fx-catalog.ts), [SVG 필터](https://github.com/gltr-company/wp3-origin/blob/ae1243a0a8a4a17ccf693515c9d0ab4c8d5890d4/remotion-renderer/src/effects/svg-filters.mjs).

WP4의 실제 최종 조립 계약은 계획 JSON → 클라이언트 FFmpeg 실행 → final asset 업로드다. 현재 계약은 cut만 실제 필터로 만들고 fade는 계획값만 기록한다. 도해 renderer나 브라우저 FFmpeg 합성은 main의 구현으로 확인되지 않았다. [WP4 조립 계약](https://github.com/gltr-company/wp4/blob/210e8f2de73dff72658c1d0a0444a9da49f9a5ff/canon/contracts/final-video-assembly.md)

## yt9.haejo.ai에 권하는 구조

### 사용자가 선택하는 것과 내부 엔진을 분리

카탈로그는 출처와 시각 목적을 보여주되 '클립 타입', '효과', '스타일'은 메타데이터로 구분한다. 선택의 중심은 **지도 설명 / 숫자 비교 / 글자 강조 / 자료 사진 / 순차 도해 / 씬 전환** 등 결과다. V/L은 배경 영상 생성 방식이고 효과를 그리는 그래픽 엔진과 같은 축이 아니다.

1. 효과 계열을 선택한다. 기존 씬 또는 새 레이어를 대상으로 지정한다.
2. 자연어를 입력한다. 기존 씬의 대사·지문·선택 자산·음성 정렬이 함께 들어간다.
3. compiler가 검증 가능한 MotionSpec 후보를 만든다. 누락 데이터는 표시하며 실제 수치·지리 데이터는 임의 생성하지 않는다.
4. 재생·정지·seek·화면비 변경으로 후보를 확인한다. 간단한 필드(텍스트, 숫자, 색, 길이, 강도)를 수정하면 같은 spec을 다시 컴파일한다.
5. 확정한 후보만 yt9의 세그먼트 asset 후보로 등록하고 기존 검토·선택 경로를 따른다.

### 하나의 공통 계약

MotionSpec은 renderer-neutral한 입력이다. 필요한 축은 schemaVersion, recipeId/version, sceneId/segmentId, role(scene/overlay/transition/loop), canvas(width,height,fps), timing(startFrame,durationFrames,voiceAnchors), content, assets, layer geometry, ordered motion stack, seed, provenance/source commit, review state다.

절대 시각은 **단일 음성 정렬 원천**에서 계산하고 모든 엔진에 정수 프레임을 넘긴다. Remotion 14프레임, E 0.5초, M 24fps를 섞은 채 각자가 자신의 길이를 늘리게 해서는 안 된다. 어댑터 경계에서 단위를 변환하고 출력 프레임 수를 검사한다. preview clock와 export clock도 같은 spec을 사용한다.

자연어 출력은 allowlist한 recipe ID와 파라미터 JSON이다. compiler는 이미 있는 recipe schema를 검색해 사용한다. 서버가 임의 생성 JavaScript를 바로 실행하거나 모델이 만든 HTML/SVG 문자열을 그대로 DOM에 넣는 경로는 만들지 않는다. WP 도해는 승인한 composition에서 직접 SVG를 만들며, 손그림 edge 그래프를 추가하려면 별도 확장 schema와 renderer가 필요하다.

### 어댑터별 책임

| 어댑터 | 담당 | 첫 구현에서 재사용할 코드 |
|---|---|---|
| RemotionAdapter | 정확한 글자·숫자·차트·오디오·사진 모션·camera | remotion-edit의 프레임 컴포넌트와 WP의 공유 motion math |
| DiagramAdapter | 아이콘 구성·중첩·순차 그리기·분리 대상 | WP3 composition/layout/svg/draw 모듈 |
| LegacyYt8Adapter | E/C/P/M 원본 동작 보존·기존 클립 가져오기 | 기존 Python/Pillow/FFmpeg; MP4/PNG를 yt9 asset로 반환 |
| YskAdapter | Y형 카드 사진 모션 | yt8 timeline builder + 형제 YSK renderer |
| HTMLRecipeAdapter | 외부 88종에서 선택한 DOM/SVG 레시피 | 정리·파라미터화한 자체 recipe, 시간 seek 인터페이스 |
| VideoAssetAdapter | V/L/H3/Kling 생성 영상 자산 | 기존 yt9/yt8 provider 경로; 모션 그래픽 compiler와 분리 |
| FinalCompositor | 모든 결과를 음성 타이밍으로 합성 | 기존 yt9 FFmpeg/검토/asset 선택 경로 |

공통 그래픽 패키지에는 타임라인 계산·도해 composition/layout·effects registry·renderer-neutral 입력 스키마를 두는 것이 좋다. Remotion과 미리보기 React가 이를 소비한다. M/E/P를 이후 Remotion으로 옮길 때도 기존 어댑터와 결과 프레임 비교를 먼저 한다. 구 코드를 먼저 삭제할 이유는 없다.

### 자연어 수정과 재현성

'라벨은 그대로 두고 등장만 느리게', '같은 차트를 가로로', '세 번째 숫자만 강조'는 기존 spec에 대한 구조화 patch다. 매번 전체 텍스트·자산을 다시 생성하면 검토한 대사·수치가 바뀐다. 검토 state와 spec version, recipe version, source hash, render artifact hash를 보관하면 같은 입력을 다시 렌더할 수 있다.

## 샘플과 프로덕션 구현의 구분

현재 연구 catalog의 preview_key는 샘플 UI가 제공하는 kinetic, diagram, chart, handdrawn, route, lowerthird, quote, gauge, cards, transition, photo, stamp, timeline, orbit, wp_diagram, audio 중에서 고른다. 여러 원본이 하나의 family preview를 공유한다. 특히 route(지도 경로), handdrawn(노드·화살표 손그림)는 원본 M/WP composition과 동일한 기능을 모두 재현한다는 뜻이 아니다.

첫 프로덕션 시험은 수치 기반 차트+텍스트, WP 아이콘 도해, M 지도 위치 공개 세 가지가 적합하다. 서로 다른 내용 구조와 렌더 경로를 검증할 수 있다. 동일 프레임의 preview/export, 한글 폰트·숏폼 안전영역, 0/중간/완성 seek, 음성 앵커, 잘못된 입력, 작업 격리, 확정 자산 후보 등록을 통과한 항목만 render-verified로 승격한다.

이 조사에서 source-verified까지 확인했다. 소스 원본의 실행 품질, 외부 88종의 실제 renderer parity, 모델을 연결한 자유 자연어 compiler, yt9 asset write-back, 프로덕션 MP4 렌더는 여기서 실행하지 않았다.
