Assets and Continuity Model
1. Asset Library의 위치
에셋은 Cinema Project의 하위 소유물이 아니라 SurfAI 전역에서 재사용하는 원본 리소스다. 기존 페르소나, 코디, 배경 등의 생성·저장 기능은 공용 에셋 영역에서 관리하고, Cinema Project에서는 필요한 원본의 특정 Version을 참조한다. Cinema 전용 전역 Asset 메뉴를 별도로 만들지 않는다.
Cinema 프로젝트별 폴더나 컬렉션은 원본의 물리적 저장 위치가 아니라 참조 항목의 탐색과 분류를 위한 기능이다. 원본 파일을 프로젝트에 복사하지 않으므로 같은 캐릭터, 코디, 배경을 여러 영화에서 재사용할 수 있고 각 프로젝트는 서로 다른 Version을 고정해서 사용할 수 있다.
2. 에셋 관련 엔티티
| 엔티티 | 책임 | 예시 |
|---|---|---|
| Asset | 정체성과 메타데이터를 가진 원본 리소스 | Character A, 빈티지 가방, 카페 환경 |
| Asset Version | 특정 시점의 불변 소스와 속성 | Character A의 얼굴·체형 기준 이미지 v3 |
| Cinema Asset Folder | Project 내부에서 Binding을 분류하는 가상 폴더 | 주요 인물, 카페 장면, 공용 배경 |
| Project Asset Binding | Project와 특정 AssetVersion의 고정 참조 | Project A는 Character A v2 사용 |
| Character Asset Mapping | 영화 속 Character와 기본 Persona Binding 연결 | 도윤은 Persona v2 사용 |
| Shot Character Mapping | Shot 화면에 등장하는 Character와 역할 | S3에 도윤이 주 피사체로 등장 |
| Domain Mapping | 향후 배경·의상·소품을 의미에 맞는 구조로 연결 | Scene 환경, Character Look, Prop Occurrence |
| Asset State | 시간 또는 Beat에서 달라지는 상태 | 컵을 들고 있음, 젖은 코트, 시선을 피함 |
| Shot Reference Assignment | 특정 Shot 생성에 실제 전달할 미디어·데이터 | 얼굴 정체성 시트, 표정 참조, 재질 이미지 |
Asset은 정체성, AssetVersion은 불변 원본 데이터, ProjectAssetBinding은 프로젝트 포함 관계와 버전 고정, 도메인별 Mapping은 영화 속 의미와 등장 범위, Asset State는 시간에 따른 상태, Shot Reference Assignment는 생성 입력을 담당한다. 이 정보를 하나의 범용 JSON이나 계층형 포함·제외 규칙에 함께 저장하지 않는다.
3. Project 폴더와 Binding
CinemaAssetFolder
├── id
├── projectId
├── parentId
├── name
└── orderIndex
ProjectAssetBinding
├── id
├── projectId
├── folderId
├── assetVersionId
├── alias
├── role
├── notes
├── orderIndex
└── createdAt
Binding은 원본 데이터의 복사본이 아니다. assetVersionId를 통해 실제 소스와 속성을 해석하며 프로젝트별 별칭, 역할, 메모만 저장한다. Binding은 프로젝트에서 선택 가능한 에셋의 범위를 정하지만 모든 Sequence나 Scene에 자동 등장한다는 뜻은 아니다.
현재 구현 계약
- 원본 편집 데이터는 기존
personas,coordis테이블에 남는다. - 최초 프로젝트 연결 시 원본 소유자의
ownerId + kind + sourceId로Asset정체성을 지연 생성한다. SYSTEM 원본은 소비 사용자별로 복제하지 않고 같은 정체성과 Version을 공유한다. - 연결 시점의 원본 필드를
AssetVersion.snapshot에 저장하고 SHA-256 checksum이 같은 Version은 재사용한다. 원본 수정 시각은sourceUpdatedAt컬럼에만 저장하며 내용 checksum에는 포함하지 않는다. - 현재 지원하는
kind는PERSONA,COORDI다. Environment와 Prop은 원본 기능과 타입별 snapshot 계약이 확정된 뒤 추가한다. - 프로젝트 상세의
Assets탭은 전역 원본을 선택하는 UI이며 별도 Cinema 원본 저장소가 아니다. - 폴더 삭제 시 해당 폴더의 Binding은 삭제되지 않고 미분류 상태가 된다. 하위 폴더는 함께 삭제된다.
- 한 Project에는 같은 Asset의 Binding을 하나만 둔다. 다시 추가하면 기존 고정 Version을 유지하고 프로젝트 메타데이터만 반영한다.
- 원본이 수정돼도 Binding은 자동 갱신되지 않는다. 사용자가 갱신 명령을 실행할 때만 새 snapshot을 생성하거나 기존 checksum Version을 재사용한다.
- Character Asset Mapping이 참조하는 Persona Binding은 해당 Mapping을 해제하기 전까지 프로젝트에서 제거할 수 없다.
현재 API
| Method | Path | 책임 |
|---|---|---|
GET | `/v1/cinema/projects/:projectId/assets/sources?kind=PERSONA | COORDI` |
GET/POST | /v1/cinema/projects/:projectId/assets/folders | 프로젝트 가상 폴더 조회·생성 |
PATCH/DELETE | /v1/cinema/projects/:projectId/assets/folders/:folderId | 폴더 변경·삭제 |
GET/POST | /v1/cinema/projects/:projectId/assets/bindings | 고정 Version 연결 조회·생성 |
PATCH/DELETE | /v1/cinema/projects/:projectId/assets/bindings/:bindingId | 프로젝트별 별칭·역할·메모 변경 또는 연결 해제 |
POST | /v1/cinema/projects/:projectId/assets/bindings/:bindingId/refresh | 최신 원본 snapshot으로 명시적 갱신 |
POST/DELETE | /v1/cinema/projects/:projectId/characters/:characterId/asset-mapping | Character와 Persona Binding 연결·해제 |
4. Character Registry와 Persona 연결
시나리오에서 추출한 등장인물 정체성과 공용 Persona 원본은 같은 엔티티가 아니다. CinemaCharacter는 영화 안의 서사적 인물이며, CinemaCharacterAssetMapping은 그 인물의 기본 외형 정체성으로 사용할 ProjectAssetBinding을 가리킨다.
CinemaCharacter (Project 공용)
-> CinemaCharacterAssetMapping
-> ProjectAssetBinding
-> immutable Persona AssetVersion
- Character Proposal은 ScriptRevision별 분석·검토 이력이고, 발행된 Character는 Project 전체에서 재사용한다.
- 한 Character에는 기본 Persona Binding 하나를 연결한다. 현재는 기본 정체성 연결 한 종류만 제공하므로 별도 역할 컬럼을 두지 않는다.
- 연결 대상은 Project에 이미 포함된
PERSONABinding만 허용한다. - Shot LLM은 Character key와 화면 내 역할만 제안한다. Asset ID나 참조 이미지를 직접 선택하지 않는다.
- 서버가
Shot -> Character -> CharacterAssetMapping -> ProjectAssetBinding -> AssetVersion을 결정적으로 해석한다. - Persona 연결을 바꾸면 이후 생성 입력은 새 고정 Version을 참조하지만 Shot의 서사·카메라 설계는 재분석하지 않는다.
- Character에 연결된 Binding은 매핑을 먼저 해제하기 전까지 Project에서 제거할 수 없다.
- 시나리오 페이지의 왼쪽
인물 에셋패널은 승인 Character와 Project Persona Binding을 함께 보여주고 즉시 연결할 수 있다. 시나리오 등장인물팝업은등장인물 분석 | 캐릭터 시트탭으로 분석·발행과 Persona 매핑을 한 흐름에서 제공한다.- 전체 에셋 종류, 폴더, Binding 메타데이터 관리는 기존 Project Assets 화면이 계속 담당한다.
5. 계층별 등장 요소 결정
범용 CinemaAssetUsage와 INCLUDE | EXCLUDE 상속은 사용하지 않는다. 서사 계층과 물리적 등장은 같은 구조가 아니며, Sequence에서 포함한 에셋을 모든 하위 Scene으로 상속하면 실제로 등장하지 않는 인물·소품까지 생성 문맥에 들어가기 때문이다.
| 계층 | 에셋 관련 책임 |
|---|---|
| Project | 사용할 수 있는 고정 AssetVersion과 Character Registry 관리 |
| Sequence | 서사 목적과 스타일 기본값 관리. 에셋 등장 범위를 상속하지 않음 |
| Scene | 장소·시간·등장인물 등 원문 기반 제작 문맥. 향후 환경·의상·소품 후보를 타입별 Proposal로 분석 |
| Beat | 원문 속 행동·감정·퍼포먼스와 시간에 따라 변하는 Asset State 관리 |
| Shot | 실제 화면에 등장하는 Character를 명시적으로 매핑하고 최종 Reference Assignment를 확정 |
인물 이외의 에셋도 같은 원칙을 적용한다. 향후 하나의 범용 사용 규칙을 다시 만들지 않고 의미가 분명한 SceneEnvironmentMapping, CharacterLookMapping, PropOccurrence 같은 타입별 관계를 도입한다. LLM은 원문과 승인된 상위 데이터를 바탕으로 후보를 제안하고 사용자가 검토하며, 최종 생성 참조는 Shot 단위에서 확정한다.
6. 권장 Asset 분류
| 분류 | 대표 속성 |
|---|---|
| Character / Persona | 외형 정체성, 체형, 얼굴·헤어 참조, 기본 의상 |
| Coordi / Costume | 의상 구성, 소재, 색상, 착용 조건 |
| Prop | 물체 형태, 재질, 크기, 상호작용 방식 |
| Environment | 장소, 건축·자연 요소, 배경 참조 |
| Vehicle | 형태, 스케일, 상태, 이동 특성 |
| Material | 표면, 텍스처, 반사·거칠기 정보 |
| Lighting Preset | 광원 배치, 색온도, 강도, 분위기 |
| Camera Preset | 렌즈, 높이, 앵글, 움직임 기본값 |
| Audio | 음악·효과음·대사 참조 |
Asset 타입별 스키마는 다르므로 공통 메타데이터와 타입별 속성의 두 층으로 설계한다. 모든 에셋에 Character 전용 필드를 강제하지 않는다.
7. 버전과 편집 정책
생성 결과의 재현성과 이전 Shot의 연속성을 위해 사용된 Asset Version은 변경 불가능해야 한다.
- 원본 에셋을 수정한 뒤 Project에서 명시적으로 갱신하면 새 Asset Version을 만든다. checksum이 같으면 기존 Version을 재사용한다.
- ProjectAssetBinding은 프로젝트에 추가한 시점의
assetVersionId를 고정한다. - Asset의
currentVersionId가 바뀌어도 기존 Binding은 자동 변경하지 않는다. - 새 버전이 존재하면 프로젝트에 알리고 사용자가 명시적으로 업그레이드한다.
- 이미 생성된 Attempt는 당시 사용한 Asset Version을 계속 참조한다.
- 새 버전을 이후 Shot에 적용할지는 ProjectAssetBinding을 명시적으로 갱신하거나 이후 별도 Binding·Version 정책으로 선택한다.
- 프로젝트 전용 외형 변경은 원본 Asset을 바꾸지 않고 프로젝트 전용 파생 Version 또는 향후 Asset State 계약으로 기록한다.
- 하나 이상의 Project가 참조하는 Version은 물리 삭제하지 않고 Archive 또는 읽기 전용 상태로 보존한다.
8. 연속성 검토의 입력
연속성 검토는 하나의 생성 프롬프트 필드가 아니라 구조화된 비교 대상이 필요하다.
| 범주 | 예시 |
|---|---|
| 외형 | 헤어, 의상, 분장, 소지품 |
| 물리 상태 | 위치, 손에 든 물체, 손상, 젖음, 시간 경과 |
| 관계와 감정 | 인물 간 거리, 태도, 감정 전환 |
| 공간 | 오브젝트 배치, 조명, 날씨, 시간대 |
| 영상 설정 | 화면비, 카메라 규칙, 색보정 경향 |
초기에는 이전·다음 Beat 또는 Shot의 effective state를 나란히 비교하는 검토 UI부터 시작할 수 있다. 자동 충돌 판정은 에셋 타입별 상태 스키마와 승인 규칙이 확정된 뒤 도입한다.
9. 생성 입력에서의 Asset 정보 라우팅
에셋 정보가 현재 Project에 연결되어 있다는 사실만으로 모든 속성을 Renderer에 전달하지 않는다.
| 정보 | 기본 처리 |
|---|---|
| 현재 시작 프레임에 보이는 정체성·의상·소품·상태 | FRAME_RENDERER, VALIDATOR 후보 |
| Shot 안에서 변하는 행동·소품·외형 상태 | MOTION_RENDERER, VALIDATOR 후보 |
| 다음 Scene에서 바뀔 외형이나 미래 상태 | Renderer audience 없이 withheldInformation에 보존 |
| 결과에 나타나면 안 되는 연속성 위반 조건 | VALIDATOR |
| 사용자가 확인·편집해야 하는 메모 | 실행 audience와 별개로 Cinema 편집 화면에 표시 |
기본 Reference Resolver는 Shot Character Mapping, 타입별 도메인 Mapping과 Frame/Motion Specification을 기준으로 실제 전달할 Asset Version과 Reference 역할을 결정적으로 해석한다. 선택적 Context Director를 사용하는 프로젝트에서는 전후 문맥을 바탕으로 참조 후보를 제안할 수 있지만, 사용자가 확정한 Mapping과 Version을 자동으로 덮어쓰지 않는다. Reference Composer는 확정 결과를 모델 상한에 맞게 합성하거나 제외하고, 실제 전송된 자료를 Attempt 스냅샷에 남긴다. Shot Specification과 생성 Package 계약은 Shot Specifications, Plans, and Context Compilation을 따른다.