2026년 7월 변경 이력
2026-07-31 (금)
Cinema 계층형 Asset Usage 제거
- 등장인물 참조 경로를
Project Character -> Persona Binding -> Shot Character Mapping으로 확정하면서 동일 사실을 중복 관리하던 범용CinemaAssetUsage를 제거 - Sequence·Scene 공통 영역과 Beat·Shot 상세의
상속 | 사용 | 제외UI, 프론트 API·Query·타입 계약 제거 - Asset Usage 컨트롤러·서비스·엔티티와 Binding 삭제 차단 의존성을 제거하고 테이블·enum 드롭 마이그레이션 추가
- ProjectAssetBinding의 버전 고정과 Character에 연결된 Persona Binding 보호는 유지
- 향후 배경·의상·소품은 범용 계층 상속 대신
SceneEnvironmentMapping,CharacterLookMapping,PropOccurrence등 타입별 Proposal·Mapping으로 확장하기로 결정
Cinema 등장인물 분석·캐릭터 시트 매칭 구현
- 최신 ScriptRevision 원문에서 등장인물, 별칭, 서사 역할, 외형 근거, 연속성 중요도와 고정 시트 필요 여부를 추출하는
cinema.character.defaultStructured Output 추가 - Character 제안을 Revision별로 편집·채택·제외·전체 발행하고, 발행 결과를 Revision 교체와 독립적인 Project Character Registry로 유지
- 원문 인용을 중복 본문이 아닌 검증된 문자 범위 배열로 저장하고 기존 Character는 LLM이 서버 발급 key로만 매칭하도록 제한
- Project Character와 Persona ProjectAssetBinding의 기본 정체성 연결 API 및 Assets 화면 매칭 UI 추가. 연결된 Binding 제거 차단
- 작품 정보의 수동 등장인물 입력을 제거하고 확정된 Project Character Registry를 읽기 전용 목록으로 자동 표시
- 시나리오 왼쪽에 승인 인물·Persona 시트·즉시 매핑을 제공하는 독립 스크롤 패널을 추가하고, 등장인물 팝업을
등장인물 분석 | 캐릭터 시트탭으로 확장 - 시나리오 안에서 공용 Persona를 Project Binding으로 바로 추가할 수 있도록 기존 에셋 추가 다이얼로그를 Persona 전용 모드로 재사용
- Shot 분석에 승인 Character key와 화면 내 역할을 추가하고 제안·정식 Shot Character Mapping을 저장, Shot 편집에서 수동 수정과 캐릭터 시트 연결 상태 확인 지원
- Character Registry 변경은 미발행 Shot 계획을
STALE로 전환하되 Persona 연결 변경은 재분석 없이 이후 생성 입력에 반영하는 경계 확정 - 신규 Character/Mapping 테이블과 ProposalSet 타입 마이그레이션, Cinema 24개 테스트 스위트와 백엔드 빌드, 프론트 TypeScript·대상 ESLint 검증
Cinema 계층형 Asset Usage 구현
- ProjectAssetBinding을 프로젝트에서 선택 가능한 고정 AssetVersion으로 유지하고, 실제 제작 범위의 사용 여부를 분리하는
cinema_asset_usages모델과 마이그레이션을 개발 DB에 적용 - Sequence·Scene·Beat·Shot별
INCLUDE | EXCLUDE, 역할 override, 사용 메모와 로컬 규칙 삭제를 통한 상속 복귀 계약 구현 - Project·ScriptRevision·Sequence·Scene·Beat·Shot 범위 조합을 CHECK·복합 FK·부분 유니크 인덱스로 검증하고, Usage가 남은 Project Asset 제거를 차단
Binding 기본값 < Sequence < Scene < Beat < Shot우선순위와 Shot의 Beat Mapping별 coverage 결과를 보존하는 effective resolver 및 API 추가- Sequence·Scene 공통 영역과 승인된 Beat·Shot 개별 상세에 접이식 사용 에셋 편집 UI 추가, 과거 Revision·승인 취소 항목 읽기 전용 처리
- Asset Usage resolver와 Project Asset 회귀 테스트 9개, 백엔드 빌드, 프론트엔드 TypeScript·대상 ESLint 검사 통과
Cinema ShotRenderPlan·Context Compiler 계약 확정
- Shot 설계와 Generation Attempt 사이에 사용자 확정형
ShotRenderPlan을 두고, LLM 실행 이력ContextRun과 검토·수정 가능한 생성 준비 결과를 분리 - 같은 Scene의 이전·현재·다음 Shot, 매핑 Beat, Edit Relation, Shot Character·타입별 에셋 Mapping을 고정하는 Context Window snapshot과 source hash 범위 정의
- Context Director 출력을 Shot 역할, 현재 상태, routed directive, 관객 추론, withheld information, validation criteria로 구조화
- Field Routing을 단일 enum 대신
FRAME_RENDERER | MOTION_RENDERER | VALIDATOR복수 audience로 확정하고 사용자 접근 제어와 분리 - 시작 순간의 Frame Brief와 시간적 전개의 Motion Brief 스키마, Prompt를 원천 데이터가 아닌 Compiler 산출물로 취급하는 정책 확정
DRAFT | CONFIRMED | STALE | ARCHIVEDPlan 생명주기, 확정본 불변·수정본 version·원천 변경 시 새 Attempt 차단·과거 Attempt 보존 규칙 정의- ContextRun·ShotRenderPlan 목표 테이블, API 경계,
Shot 설계 | 연결 설계 | 생성 준비화면과 Character Mapping부터 시작하는 구현 순서 문서화
2026-07-30 (목)
Cinema Edit Relation 설계·발행 구현
- 동일 Scene의 활성 Shot 계획을 기준으로
N개 Shot에 정확히N-1개의 방향성 인접 관계를 제안하는cinema.edit-relation.defaultStructured Output 구현 - 전환 방식·상세, 관객 추론, 감정 효과, 대비/일치, 정보 공개, 연결 연출 메모와 category/priority 기반 연속성 조건을 구조화
- 분석 당시 Shot 계획 ID와 Project·Sequence·Scene·Beat·Shot 문맥 hash를 고정하고, 서버에서 AI의
S1 -> S2key를 실제 Shot ID로 변환한 뒤 개수·순서·동일 Scene을 재검증 - Relation Proposal 개별 편집·채택·채택 취소·전체 채택, 전체 채택 후 계획 확정, 발행 계획 수정본 생성과 계획 단위 보관 API 구현
- 정식 Relation의
ACTIVE | NEEDS_REVIEW | ARCHIVED상태와 Project·Sequence·Scene·Beat·Shot 변경 시 미발행 결과STALE, 발행 결과 재검토 또는 보관 생명주기 적용 - Shot 작업공간에
Shot 설계 | 연결 설계모드를 추가하고 Shot band 사이 Relation 검토, 분석 이력, 승인된 연결 탐색 UI 구현 cinema_edit_relation_proposals,cinema_edit_relations, ProposalSetsourceShotProposalSetId, 동일 Scene Shot 복합 FK와 활성 쌍 부분 유니크 인덱스 마이그레이션을 개발 DB에 적용- Cinema 핵심 7개 테스트 스위트 44개 테스트, 백엔드 Cinema lint·빌드, 프론트엔드 대상 lint·TypeScript 검사 통과
2026-07-28 (화)
Cinema Sequence·Scene 복원 전 편집 구현
- 승인 취소된 Sequence 제안 카드에서 정식 Sequence의 제목, 요약, 서사 목적을 편집하고 같은 ID로 다시 승인하는 흐름 추가
- 보관된 Sequence 제안 카드에 분할·제외를 다시 제공하고 구조 변경 시 원본 Proposal을 검토 상태로 되돌리는 흐름 추가
- 분할·제외된 기존 Sequence는
sourceProposalId를 해제해 하위 제작 데이터와 함께 복원 불가 과거 이력으로 보존하고 새 Sequence에 자동 이전하지 않음 - 복원 편집에서는 원본 Sequence Proposal, ScriptRevision 원문 범위와 하위 Scene·Beat·Shot 제작 데이터를 유지하고 정식 Sequence의 편집본만 갱신
- Sequence 문맥이 바뀌면 기존 미발행 Scene·Beat·Shot ProposalSet을
STALE로 전환해 오래된 분석 결과의 사용 방지 - 최신 ScriptRevision의 보관된 Sequence에만 편집·재승인을 허용하고 과거 버전은 읽기 전용으로 유지
PATCH /v1/cinema/projects/:projectId/sequences/:sequenceId/restoration-draftAPI와 상태·Revision 경계 단위 테스트 추가- 승인 취소된 Scene 제안 카드에 제목·행동·기능·장소·시간대·내외부·날씨·등장인물 편집, 분할, 제외, 다시 승인 작업 추가
- Scene 복원 편집은 동일 ID와 기존 Beat·Shot을 유지하고 미발행 하위 분석 결과를
STALE처리하며, 분할·제외는 기존 Scene과 Beat·Shot을 복원 불가 이력으로 분리 PATCH /v1/cinema/projects/:projectId/sequences/:sequenceId/scenes/:sceneId/restoration-draftAPI와 Scene 상태·Revision·구조 변경 경계 테스트 추가- Cinema 17개 테스트 스위트 76개 테스트, 백엔드·프론트엔드 프로덕션 빌드와 대상 lint 통과
Cinema Beat 개별 복원 구현
- 정식 Beat의 사용자 직접 보관을
MANUAL, 새 Beat ProposalSet 전체 발행으로 대체된 과거 Beat를SUPERSEDED로 구분 - 사용자가 직접 보관한 Beat를 새 행 생성 없이 동일 ID로 다시 활성화하는 복원 API와 원본 Beat 제안 카드의
보관됨상태·다시 승인버튼 추가 MANUAL보관 Beat의 제목, 행동, 서사 기능, 감정 전환, 인물별 퍼포먼스, 블로킹을 복원 전에 편집·저장하고 수정된 값으로 다시 승인하는 흐름 추가- 과거 발행 묶음의
SUPERSEDEDBeat는 개별 복원할 수 없도록 차단해 서로 다른 Beat 계획이 섞이는 문제 방지 - Beat 보관·복원 시 기존 정식 Shot을 보관하고 미발행 Shot 제안을
STALE처리해 Beat-Shot Mapping 무결성 유지 - 기존 데이터의 최신 발행 묶음 여부를 기준으로 보관 사유를 역산하는 마이그레이션 적용
- Cinema 17개 테스트 스위트 65개 테스트와 백엔드 빌드, 프론트엔드 TypeScript 검사 통과
2026-07-27 (월)
Cinema Shot Proposal·Beat-Shot Mapping 구현
- Scene 상세를
Beat / Shot / Scene 원문작업 뷰로 확장하고, 정식 Beat 발행 후 Shot 설계 실행·이력·제안·정식 Shot 패널 추가 - Project·Sequence·Scene과 활성 Beat를 입력으로 Shot 목적, 화면 크기, 앵글·높이, 렌즈, 움직임, 구도, 피사체, 예상 길이와 Beat 번호 Mapping을 생성하는
cinema.shot.defaultStructured Output 구현 - Shot 추가·수정·정렬·제외, Beat Mapping 역할·선택 시간 범위·메모 편집과 미커버 Beat 경고·발행 차단 지원
- 모든 Shot의 최소 1개 Beat 연결과 모든 활성 Beat 커버리지를 검증한 뒤 Shot과 M:N Mapping을 원자적으로 발행하고 반복 발행은 기존 결과 반환
- Beat 변경·보관·재발행 시 미발행 Shot ProposalSet을
STALE처리하고 기존 활성 Shot을 보관하는 연쇄 생명주기 적용 - 활성 Beat의 유일한 커버리지인 Shot은 개별 보관을 차단해 발행 이후에도 커버리지 불변 조건 유지
- 제안·정식 Mapping을 분리한 4개 Shot 테이블, 동일 Scene 복합 FK, 중복 쌍·coverage·순서 CHECK와 부분 유니크 인덱스 마이그레이션 적용
- Cinema 16개 테스트 스위트 60개 테스트, 백엔드 빌드·대상 lint, 프론트엔드 TypeScript·대상 lint 통과
Cinema Beat Proposal·원자적 발행 구현
- 승인된 Scene 상세에
Beat / Scene 원문작업 뷰와 Beat 분석 실행, 분석 이력, 제안 검토, 정식 Beat 패널 추가 - Scene 원문을 관찰 가능한 행동, 서사 기능, 감정 전환, 인물별 감정·의도·퍼포먼스, 블로킹으로 분해하는 OpenAI Structured Output과
cinema.beat.defaultModel Profile 구현 - Beat Proposal 추가·수정·정렬·분할·병합·제외를 지원하고 카메라·렌즈·구도 등 Shot 속성은 Beat 계약에서 제외
READY제안이 Scene 원문 전체를 덮는지 검증한 뒤 기존 활성 Beat를 보관하고 새 묶음을 한 트랜잭션으로 발행. 발행 반복 요청은 기존 결과를 반환하고STALE세트 발행은 차단cinema_beat_proposals,cinema_beats, ProposalSetsourceSceneId·publishedAt, 복합 범위 FK·CHECK·부분 유니크 인덱스 마이그레이션을 개발 DB에 적용- Beat 경계·분석 입력 hash·Model Profile·단일/다중 원문 커버리지 테스트, 백엔드 빌드, 프론트엔드 TypeScript·대상 lint 통과
- Beat 분석 hash에서 ID·상태·
updatedAt같은 저장 메타데이터를 제외해 분석 시작 시 Project 갱신만으로 결과가STALE이 되던 문제 수정
2026-07-26 (일)
Cinema Project Assets 구현
- 기존 Persona·Coordi를 편집 가능한 공용 원본으로 유지하고, Project 연결 시점의 불변 snapshot을
AssetVersion으로 고정하는 구조 구현 Asset,AssetVersion,CinemaAssetFolder,ProjectAssetBinding테이블과 checksum Version 재사용, SYSTEM 원본 Version 공유, 폴더·순서·고정 Version 무결성 제약 추가/cinema/:projectId에 Assets 탭을 추가하고 원본 선택, 가상 폴더 분류, 프로젝트별 별칭·역할·메모 편집, 명시적 버전 갱신·연결 해제 지원- 원본 미디어의 영구 S3 경로는 snapshot에 저장하고 API 응답에서만 단기 preview URL을 생성하도록 분리
- Cinema 저장 중복 점검 결과를 문서화하고 원문 발췌·Draft·수동 Proposal snapshot 중복은 제거하되 재현성 snapshot과 목록 projection은 의도적으로 유지
- Asset Version 단위 테스트, 백엔드 빌드, 프론트엔드 TypeScript·대상 lint 통과
Cinema 저장 구조와 무결성 정리
cinema_script_drafts를 제거하고 저장 확인 시 제출 본문으로 immutable ScriptRevision을 직접 생성하도록 API와 UI 전환expectedRevisionId기반 충돌 검사, 동일 hash 멱등 저장, RevisioncharacterCount저장과 본문 없는 목록 조회 적용- Sequence·Scene 계층의
sourceExcerpt중복 컬럼을 제거하고 ScriptRevision의 절대sourceStart·sourceEnd로 상세 응답에서 복원 - Proposal 검토 상태를
PENDING | ACCEPTED | REJECTED로 정리하고origin,hasUserChanges, AI 전용originalSnapshot으로 책임 분리 - Project·Revision·Sequence 범위 복합 FK, source range·order·origin CHECK, 대상별 단일
PROCESSING부분 유니크 인덱스 추가 - Project, Revision, ProposalSet, Sequence, Scene 목록을 요약 조회로 분리해 본문과 상세 실행 메타데이터의 불필요한 로드 제거
- 개발 DB 마이그레이션 후 기존 Cinema 행 수 보존과 제약 생성을 확인하고 백엔드 빌드·Cinema 테스트·프론트엔드 타입 검사를 통과
2026-07-25 (토)
Cinema 3단계 Scene Proposal 구조화 구현
- 승인된 Sequence에서
/cinema/:projectId/sequences/:sequenceId상세 작업공간으로 이동하고 Sequence 원문과 Scene 분석 이력을 조회하도록 구현 - OpenAI Structured Output으로 같은 장소와 연속 시간 기준의 Scene 후보를 생성하고, marker를 Sequence 원문에서 검증해 ScriptRevision 절대 offset으로 저장
- Scene Proposal의 제목, 요약, 서사 목적, 장소, 시간대, 내외부, 날씨, 등장인물, 원문을 검토하고 추가·수정·정렬·분할·병합·제외·승인할 수 있는 UI/API 추가
- AI 제안과 정식 Scene을 분리하고 사용자 승인 시에만
cinema_scenes를 생성하도록 구성. 재분석은 기존 Scene을 수정하거나 삭제하지 않음 CinemaProposalSet.sourceSequenceId,cinema_scene_proposals,cinema_scenes와 FK·인덱스·enum 마이그레이션 추가 및 로컬 DB 적용 확인- Scene source hash 기반
STALE, Sequence별 중복PROCESSING방지, 분석 메타데이터·오류 추적을 Sequence Proposal과 동일한 계약으로 적용 - Cinema 경계·해시 단위 테스트, 백엔드 빌드·lint, 프론트엔드 TypeScript·대상 lint 통과
Cinema 1단계 Project·ScriptDraft·ScriptRevision 구현
- 메인 프론트엔드에
시네마메뉴,/cinemaProject 목록·생성·삭제 화면과/cinema/:projectIdScript 작업공간 추가 - Script 편집은 브라우저 로컬 상태로 유지하고, 사용자가 저장 확인 시 Draft 갱신과 다음 불변 Revision 생성을 한 트랜잭션으로 처리하도록 구현
- 현재
시나리오 vN또는vN 기반 편집본표시, 저장 전 다음 버전 안내,expectedUpdatedAt기반 409 충돌 처리와 재조회 흐름 구현 - Project 제목·로그라인·장르 편집, Revision 생성·목록·읽기 전용 원문 미리보기 구현
- 백엔드에 평면도
film모듈과 분리된cinema모듈 및 소유자 검증 API 추가 cinema_projects,cinema_script_drafts,cinema_script_revisions테이블과 cascade·고유 version·index·FK 마이그레이션 추가- ScriptRevision은 연속 version, 원문 snapshot, SHA-256 content hash, Draft 수정 시각과 생성자를 저장하고 수정·삭제 API를 제공하지 않도록 구성
- 백엔드 해시 단위 테스트·빌드·대상 lint, 프론트엔드 TypeScript·대상 lint 통과, 로컬 DB 마이그레이션 적용과 인증 API 401 보호 응답 확인
Cinema LLM 런타임과 모델 교체 계약 확정
- LLM API 키를 사용하도록 과금·인증 경계를 확정
- OpenAI Responses API를 최초 Provider로 사용하되 Cinema 도메인은 실제 모델명 대신 논리 Model Profile을 참조하고 Provider Adapter가 요청과 응답을 변환하도록 설계
- 사용자 모델 선택 UI를 제거하고
cinema.sequence.default단일 Profile을 서버에서 관리하며 기본 모델을 비용 효율형gpt-5.6-luna로 설정 - Sequence·Scene 분석 결과는 JSON Schema 기반 Structured Output과 서버 검증을 거쳐 Proposal로 저장하도록 정의
- 모델, snapshot, Profile, Prompt·Schema 버전, 토큰 사용량, 지연 시간과 오류를 ProposalSet 또는 LLM Run에 추적하도록 계약
- MVP에서는 배포 설정 기반 Profile과 서비스 소유 키를 사용하고 BYOK, 런타임 Profile 관리자 UI, 실제 LLM Worker는 후속 Proposal 단계로 분리
📚 Cinema 내부 라우트·ScriptRevision·공용 에셋 Binding 결정
- 신규 영화 제작 서비스 위치를 별도
film.surfai.org가 아닌 메인 SurfAI의/cinema라우트로 확정하고 기존 평면도 에디터는 독립 기능으로 분리 - Cinema MVP를 Project 생성, Script 입력, Sequence Proposal 검토, Sequence별 Scene Proposal 검토, Scene 기본 정보 관리까지로 한정하고 평면도·Scene Layout·Blender를 제외
- Script 분석 시점의 불변
ScriptRevision, 분석 실행별ProposalSet, Sequence/Scene Proposal 상태와 승인·재분석·STALE계약을 문서화 - 페르소나·코디·배경을 공용
에셋메뉴에서 원본과 Version으로 관리하고, Cinema Project는CinemaAssetFolder와ProjectAssetBinding으로 특정 AssetVersion을 고정 참조하도록 정의 - 공용 Asset의 최신 Version이 바뀌어도 Project Binding은 자동 변경하지 않고 명시적 업그레이드와 참조 Version 보존 정책을 적용
2026-07-24 (금)
📚 Film 서비스 계층형 데이터 모델 문서화
Film Service문서 카테고리를 신설하고, AI 영화 제작 워크스페이스의 제품 정의와 사용자 흐름,Project -> Sequence -> Scene -> Beat/Shot계층 모델,Beat-Shot MappingM:N 계약을 정리- 독립 Asset Library와 Project/Sequence/Scene/Beat/Shot별
Asset Usage,Asset State,Asset Reference구분, 에셋 버전과 연속성 검토의 기준을 문서화 - Scene 레벨의 Concept Frame, Scene Layout, Blender의 Physical/World State 역할 및 Beat/Sequence의 Narrative State 역할을 분리해 정의
- Prompt/Reference Composer, 모델 Adapter, Generation Attempt, Selected Clip, 후속 편집 단계의 목표 계약과 현재 구현되지 않은 범위를 명시
- 현재 평면도 에디터 MVP와 장기 계층형 서비스 모델을 구분하고, 구현 우선순위와 미결정 설계 과제를 기록
📚 Film Context Director·Edit Relation·2단계 생성 설계 추가
- 데이터 상속과 Renderer Prompt 주입을 분리하고, 전후 Shot·활성 Beat·연속성·편집 의도를 해석하는
Context Director AI와 실제 화면을 구현하는Shot Renderer의 역할을 구분 director_private,generator_visible,validator_only,editor_visibleField Routing과 미래·숨김 정보 차단, 긍정형 현재 상태 중심 Renderer Brief 원칙을 문서화- 기본 3-Shot Context Window, 생성 전 Brief 작성과 생성 후 맥락 QA 기준을 추가
- 쿨레쇼프 효과와 Shot 연결의 관객 추론을 표현하는
Edit Relation모델, 순서 변경 시needs_review, Timeline/Edit Relation UI 요구사항을 정의 - Shot을
Frame Design과Motion Design으로 확장하고 Start Image 생성과 시작 이미지 기반 Video 생성을 분리하며, Video Prompt가 기존 프레임 정보를 반복하지 않는 원칙을 반영
2026-07-20 (월)
✅ film — 평면도 프롬프트 동적화 + 배치 경고 배지
- 없는 조명 묘사 방지: 평면도 프리픽스가 씬에 실제로 존재하는 타입만 설명하도록 동적화 — 조명이 없는 씬인데도 "small glowing dot" 문구 때문에 출력에 조명이 그려지던 문제 해소. 조명은 "광원 위치를 표시하는 점"으로만 서술
- 인물 방향 지시도 동적화: 인물이 없는 씬에서는 틱 마크/방향 지시 문장 자체를 프롬프트에서 제외
- 배치 경고 배지: 오브젝트끼리 너무 가까우거나(도형 반경 기준 0.8배 이내) 인물이 카메라 FOV 안 바로 앞(110 월드 단위 이내)에 있으면 캔버스 상단에 작은 경고 배지 표시. 정보 제공 전용이라 생성 요청을 막지 않으며, ✕로 닫을 수 있고 경고 구성이 바뀌면 다시 표시됨 (
sceneWarnings.ts+SceneWarnings.tsx) - frontend-vivid-film lint/build 통과 (커밋 8268cf3)
✅ film — 캡처 정제(그리드 숨김·레이블 확대) + 단일 캐릭터 지시
- 캡처 시 배경 그리드 레이어(
gridLayer)를 숨겨 평면도에 그리드가 찍히지 않도록 함 - 캡처 전용으로 레이블 텍스트를 12px → 22px(폭 200)로 확대해 AI 모델이 라벨을 더 잘 읽도록 하고, 캡처 후 원래 크기로 복원
- 캐릭터 패널 지시 강화: "각 패널은 정확히 한 명의 캐릭터만 담고(한 패널에 같은 캐릭터의 여러 뷰가 있을 수 있음), 출력에서 어떤 캐릭터도 중복 생성하지 말 것"을 명시 — 4-way 시트가 여러 명으로 오인되는 문제 완화
- frontend-vivid-film lint/build 통과 (커밋 40bb884)
✅ film — 카메라 방향 기준 회전 캡처 + 참조 프롬프트 정제
- 회전 캡처: 생성 요청 시 스테이지 전체를 회전해 대상 카메라가 캡처 이미지의 위쪽을 바라보게 함(1인칭 배치와 동일한 직관). 텍스트 레이블은 역변환으로 수평·오브젝트 하단 유지, 캡처 후 원상 복구 (커밋 f798a20)
- 동물/크리처 참조 개선: 인물 지시를 'facial identity/hairstyle/outfit' 같은 사람 전제 표현에서 "정체성과 고유 특징 유지, 동물·크리처는 절대 사람으로 바꾸지 말 것"으로 교체
- 중복 프롬프트 정리: 패널 지시를 타입별 그룹(character/light/prop/wall)으로 묶어 한 번만 서술, 동일 참조 이미지를 쓰는 오브젝트는 패널 하나로 합치고 라벨은 alias로 표기(분리 참조 미디어에는 라벨별로 각각 기록)
- 조명 도형 변경: 카메라 FOV 삼각형과 헷갈리지 않도록 삼각 웨지 제거, 글로우 점 + 광선으로 표시
- 평면도 프리픽스에 회전 방향(카메라가 이미지 위쪽을 봄), 조명 점 표기, 색상-JSON 매칭 설명 추가
- frontend-vivid-film lint/build 통과
✅ 인물별 방향 지시 강화 + 상세 모달 메인 이미지 인라인 줌
- film: 평면도 프리픽스에 인물의 방향 틱(tick mark) 설명과 "각 인물은 자기 틱이 가리키는 방향을 바라봐야 하며, 틱이 카메라를 향하지 않는 한 카메라를 바라보게 하지 말 것"이라는 지시를 추가 — 모두가 카메라를 바라보는 문제 완화 (커밋 c867b72)
- frontend-vivid-ai: 갤러리/관리자 상세 모달의 메인 결과 이미지에 인라인 줌 적용 —
useMainImageZoom훅 신설(휠/트랙패드 핀치 줌, 포인터 기준 확대, 드래그 패닝, 클릭 3배 토글, 줌 배율 배지), 참조 이미지와 동일한 조작감을 별도 모달 없이 메인 패널에서 제공 (커밋 a2879133) - frontend-vivid-film lint/build, frontend-vivid-ai eslint/tsc 통과
✅ film 에디터 — 평면도 가독성·카메라별 생성 컨텍스트 + 상세 보기 합성 참조 표시
- 회전 중심 고정: 레이블을 회전/스케일 그룹에서 분리(외곽 드래그 그룹 + 내부 도형 그룹 구조)해 트랜스포머 박스와 회전 중심이 도형에만 고정. 레이블은 항상 수평·오브젝트 아래 유지
- 카메라별 컨텍스트 분리: 생성 요청한 카메라 외의 카메라는 JSON(
buildObjectNotes)에서 제외하고,captureFloorPlan(cameraId)가 다른 카메라를 숨긴 채 스크린샷 캡처(범위 계산도 제외) - 프리셋 컬러 20색: 오브젝트 생성 시 씬에서 가장 적게 쓰인 색을 자동 배정, Inspector에 스와치 팔레트 추가, JSON에 정확한 color hex 포함 — AI가 라벨 텍스트 대신 색으로도 오브젝트를 매칭 가능
- 도형 식별성 개선: 카메라(바디+렌즈 배럴+뷰파인더), 조명(광선), 벽(해치), 소품(대각선 상자) 등 타입별 글리프 강화
- 샷 패널 공간 확보: 패널 높이를 clamp(240px, 32vh, 380px)로 늘리고 카드 내부 스크롤 + 프롬프트 영역 최소 높이 고정
- 관리자/갤러리 상세: 분리된 참조 미디어와 함께 모델에 실제 전달된 합성 참조 이미지(snapshot refs)도 맨 앞에 '합성 참조 이미지' 라벨로 표시
- frontend-vivid-film lint/build 통과 (커밋 036a678), frontend-vivid-ai eslint/tsc 통과 (커밋 b9fb6f61)
✅ film 에디터 — 레이블 가독성 + 프롬프트 정적화
- 평면도 레이블의 불투명 배경 태그 제거(텍스트+그림자만 표시)해 오브젝트·레이블끼리 서로 가리는 문제 해소
- 레이블이 오브젝트 회전/스케일에 따라 돌아가지 않도록 역변환을 적용, 항상 오브젝트 아래쪽에 수평으로 고정 — 생성용 스크린샷에서도 AI가 라벨을 읽기 쉬워짐
buildShotPrompt에서 배치 연동 동적 문구(프레임 내 좌/우 위치, 원근, 카메라를 바라본다는 지시, 샷 사이즈 추정)를 전부 제거 — 평면도 이미지와 충돌하던 facing/position 지시 소거, 구도와 무관한 스타일 지시(cinematic film still, shallow depth of field, film grain, dramatic lighting)만 유지- frontend-vivid-film lint/build 통과 (커밋 f1b055f)
✅ film 에디터 — 모든 오브젝트 타입에 참조 이미지 첨부
- Inspector의 참조 이미지 첨부 UI를 인물 외 조명·소품·벽에도 확장(인물은 '캐릭터 시트', 그 외는 '참조 이미지' 섹션으로 표기)
collectObjectsWithRefs: 참고 이미지가 있는 씬 전체 오브젝트를 역할 우선순위(인물→조명→소품→벽)로 최대 9개까지 수집- 합성 프리픽스가 패널을 타입별로 서술(character/light/prop/wall 지시문 분기)하고, 전원 인물이면 character reference sheet / 혼합이면 scene reference sheet로 명칭 분기
- ShotPanel이 FOV 내 인물만이 아니라 씬 전체의 참조 오브젝트를 합성 시트·
recipe_reference_input_images에 반영(FOV 밖 조명 분위기도 참조 가능) - frontend-vivid-film lint/build 통과 (커밋 5b66958)
✅ 참조 이미지 합성 상한 4장 → 9장 확대
- gpt-image 합성 참조 모드의 패널 상한을 4장에서 9장으로 확대: 5
9장은 3x3 그리드(768px 셀, 캔버스 2304x2304)로 합성하고 14장 레이아웃은 기존 그대로 유지 - frontend-vivid-ai: 시트 빌더 3개(
personaStudioReferenceSheet·personaReferenceSheet·styleCreationReferenceSheet)와 생성 호출부(PersonaCreatePanelReferenceGeneration.utils·styleCreationGeneration.helpers)의slice(0, 4)상한을 9로 조정, 프리픽스 패널 수 표기를 nine까지 확장 - frontend-vivid-film:
referenceSheetMAX_PANELS 4→9, 인물 5~9명 시 좌측 절반을 3x3 그리드로 합성하고 프리픽스에 그리드 읽기 순서 명시 - 상세 보기의 분리 참조 미디어 표시는 이미 상한 없이 동작(갤러리 상세 모달·페르소나/스타일 히스토리)함을 확인해 최대 9개까지 그대로 표시
- frontend-vivid-ai
tsc --noEmit·eslint, frontend-vivid-filmlint/build통과
2026-07-19 (일)
✅ 생성물 상세 보기 — 분리된 참조 미디어 + 확대(줌/패팅) 프리뷰
GalleryItemDetailModal(관리자 AI 생성·페르소나 스튜디오·스타일링 허브 공용)이snapshot.referenceInputImages를 우선 사용해 합성 이미지 대신 분리된 참조 미디어를 라벨과 함께 표시(기존 4개 제한 제거, 비디오/오디오 참조도 타입에 맞게 타일 표시)- 참조 썸네일 클릭 시 이미지는
ImagePreviewModal(휠/터치패드 줌·드래그 패팅 지원), 비디오/오디오는ReferenceMediaPreviewModal로 확대 표시 - 관리자 생성기(
useGeneratorSubmit)가 업로드한 이미지 입력을recipe_reference_input_images로 기록해 신규 생성물도 분리 표시 - film ShotPanel도 인물 참고 이미지와 평면도 스크린샷을 개별 업로드해
recipe_reference_input_images로 기록(합성 시트는 그대로image_1으로 전달) - frontend-vivid-ai
tsc --noEmit·해당 파일 eslint, frontend-vivid-filmlint/build통과
✅ film.surfai.org 에디터 디테일업 — 평면도 스크린샷 + 오브젝트 메모 AI 전달
- 생성 시 Konva 캔버스 전체를 자동 스크린샷(
stageCapture.ts, 선택 해제 후 캡처·복원, 최대 1600px PNG)해 참고 이미지로 활용 - 매핑 워크플로우(gpt-image)가 참고 이미지 1장만 지원하므로 캐릭터 시트와 평면도를 2048x1024 한 장으로 합성(좌: 인물 세로 스택 / 우: 평면도)해
image_1으로 전달, 어떤 카메라 라벨로 렌더링할지 프리픽스에 명시(createShotReference) - 모든 오브젝트에
description필드 추가(카메라: 샷 타입/연출 의도). 작성된 오브젝트만buildObjectNotes가 JSON으로 만들어 프롬프트 뒤에 부착 — 위치/회전/색상은 스크린샷에 담기므로 JSON에서 제외 - 캔버스에 모든 오브젝트(벽 포함) 이름 태그를 어두운 배경 라벨로 상시 표시해 AI가 이미지 속 오브젝트와 JSON을 라벨로 매칭 가능
- film
lint/build통과
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 씬 서버 저장 413 수정 — 참고 이미지 S3 외부화
- 씬 doc에 인물 참고 이미지가 base64 dataUrl로 포함돼 기본 body 크기 제한을 넘던 413(
request entity too large) 수정 - 백엔드에
POST /v1/storage/presigned-get추가(s3Path → presigned GET URL) frontend-vivid-film: 서버 저장 시 refImage를 S3(permanent)에 업로드하고 doc에는 s3Path만 저장, 불러오기 시 presigned-get +/v1/storage/download프록시로 dataUrl 복원(새scenePersistence.ts). 이미 업로드된 이미지는 s3Path 재사용- backend
tsc --noEmit, filmlint/build통과
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 씬 서버 저장/불러오기 API 및 FILM_SHOT_IMAGE_GEN 프리셋 추가
- 백엔드에
film모듈 신설:film_scenes테이블(마이그레이션CreateFilmScenes1772910000000)과GET/POST /v1/film/scenes,GET/PUT/DELETE /v1/film/scenes/:id제공(JwtAuthGuard + 소유자 검증, 목록은 doc 본문 제외) frontend-vivid-film에디터에 서버 저장(최초 POST·이후 PUT, 마지막 저장 시각 툴팁)과 서버 불러오기(씬 목록 모달에서 로드/삭제) 추가 — 로컬스토리지 자동 저장은 스크래치 용도로 유지- 백엔드/본프론트
FEATURE_KEYS와 관리자 워크플로우 매핑 프리셋에FILM_SHOT_IMAGE_GEN(Film Shot Image) 추가 - backend
tsc --noEmit, filmlint/build통과 (백엔드 재시작 시 마이그레이션 자동 실행)
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org Phase 0~1 구현 및 Shot Designer 분석 반영
film.surfai.org 계획의 Phase 0(백엔드 쿠키 도메인)과 Phase 1(레포/인프라 기반)을 구현하고, 레퍼런스 툴 분석을 설계 문서에 반영했습니다.
- 백엔드
getAuthCookieOptions()에AUTH_COOKIE_DOMAIN환경변수 기반 쿠키Domain속성을 추가(서브도메인 SSO 기반) frontend-vivid-filmNext.js 앱 스캐폴드, Dockerfile, GitHub 레포/submodule 등록,docker-compose.dev.yml에frontend-film서비스(포트 4100) 추가- Shot Designer(Hollywood Camera Work) 분석을 설계 문서에 반영하고 film 프론트엔드 서브모듈을 9개로 확장
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org Phase 2 구현 및 운영 도메인 기준 반영
frontend-vivid-film에 인증 연동(axioswithCredentials+ 401 refresh 인터셉터,useUser훅), 로그인 화면, 포인트 잔액 표시를 구현(lint/빌드 통과)- 실제 운영이
dev.surfai.org가 아닌surfai.org단일 환경(비용 절약)임을 반영해, 쿠키 도메인.surfai.org/ film 도메인film.surfai.org기준을 설계 문서에 명시 docker-compose.dev.yml의 film 앱 기본 API URL을https://film.surfai.org/api로 조정
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org Phase 3 평면도 에디터 MVP 구현 (로컬)
frontend-vivid-film에 Konva 기반 평면도 에디터 코어 구현: 카메라(FOV 표기)/인물/조명/소품/벽 오브젝트 배치·이동·회전·스케일, 그리드/스냅, 줌/팬, z-order,/editor라우트 신설- 실행 취소/다시 실행 히스토리, 로컬스토리지 자동 저장, 씬 JSON(v1) 내보내기/가져오기 추가(서버 저장 API는 후속)
- lint/빌드 통과
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 로컬 로그인 404 수정 및 에디터 속성 패널(Inspector) 추가
- 로컬 환경에서 film(:4100)의 로그인 요청이 Next.js 자신에게 향하던 404 수정 —
NEXT_PUBLIC_API_BASE_URL미설정 시 브라우저가http://localhost:3000/api로 직접 호출(운영은 same-origin/api프록시 방식 유지). surfai.org → film SSO 정상 동작 확인 - 평면도 에디터 우측에 속성 패널 추가: 선택 오브젝트의 이름/위치/회전/크기/색상 편집, 카메라 FOV(10~120°) 설정, 미선택 시 레이어 목록에서 클릭 선택
- 필드 편집은 포커스 세션당 1회만 히스토리에 쌓이도록
beginTransientEdit스토어 액션 추가(실행 취소 단위 개선) - lint/빌드 통과 (
frontend-vivid-film25425ab)
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 새로고침 버그 수정 및 Phase 4 샷리스트·생성 연동 (로컬)
- 새로고침 시 캔버스가 빈 상태로 남던 버그 수정 —
hydrated=false동안 ResizeObserver가 컨테이너에 붙지 못해 Stage가 마운트되지 않던 문제 (b8e3a79) - Phase 4 구현 (
9f983e8): 카메라 1개 = 샷 1개 자동 매핑, FOV 내 오브젝트를 피사체로 분석(프레임 내 좌/우·원근·인물이 카메라를 보는 방향·조명 위치), 영어 시네마틱 프롬프트 자동 생성(샷별 편집 가능) - 하단 샷 패널에서 워크플로우(IMAGE·레퍼런스 불필요 그룹)/화면비(16:9 기본)/품질(HD·FHD) 선택 후
POST /v1/generation/from-template호출,/v1/creations폴링으로 완료 시 결과 썸네일 표시, 예상 VT 비용 표기 - 실제 생성 E2E는 로컬 AI 노드(ai-server) 연결 상태에서 사용자 확인 예정
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 캐릭터 시트 참고 이미지 생성 및 복수 인물 프롬프트 개선 (로컬)
- 생성 실패 원인 진단:
Worker timeout (300s without terminal event)는 ComfyUI 컨테이너가 작업 도중 재시작(18:30:56, WS 502)되며 종료 이벤트가 유실된 인프라 이슈였음을 확인. 워크플로우 자체는 VAE 디코드까지 정상 실행되어 film → 백엔드 → ai-node-agent → ComfyUI 파이프라인은 정상 동작 - 인물 오브젝트에 캐릭터 시트 이미지 첨부 지원(최대 768px JPEG 데이터 URL로 씬 JSON에 저장). 생성 시 참조 인물들을 한 장의 합성 시트(1·2·3·4패널 레이아웃, personaStudioReferenceSheet와 동일 방식)로 만들어
/v1/storage/presigned-put업로드 후image_1로 전달 — gpt-image처럼 참고 이미지 1장 제한 워크플로우와 호환 - 복수 인물 프롬프트 개선: 인원수 명시("two people") + 인물별 위치/방향 절, 캐릭터 라벨과 시트 패널 매핑. 샷 요약에 프레임 밖 인물 수 표시, 워크플로우 선택에 참고이미지 지원 여부 표기, 미지원 워크플로우는 경고 후 시트 없이 생성
frontend-vivid-film66df8eb, lint/빌드 통과
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org 생성 실패 원인 확정 및 해상도 기본값 조정 (로컬)
- 동일 증상(
Worker timeout 300s) 재발 원인을 로그/DB로 확정: 로컬 ComfyUI가 CPU 전용(pytorch+cpu, VRAM DISABLED)인데 FHD(1920×1088) 작업 시 KSampler 1스텝 약 100초 후 VAE 디코드 구간에서 컨테이너가 재시작(2회 연속 동일 패턴, 종료 이벤트 유실 → agent 300초 타임아웃) - 대조 확인: 같은 시각 gpt-image 워크플로우 FHD 16:9 작업은 118초로 COMPLETED — film → 백엔드 → agent → ComfyUI 파이프라인 및 gpt-image 경로는 정상
- 로컬 SD 기본 워크플로우는 KSampler steps=1 테스트 구성, 백엔드가 variant 입력 min/max를 강제하지 않아 HD(1344×768)도 검증 통과 확인
- 조치: film 샷 패널 품질 기본값 FHD→HD (
948334d),docker-compose.dev.yml의 ai-node-agent에JOB_WAIT_TIMEOUT_SECONDS(기본 900) 추가. 실행 중인 agent 컨테이너는 별도 설정으로 띄운 상태라 재생성 시 반영 안내
문서 반영
service-planning/09-film-subdomain-plan.md
✅ film.surfai.org feature key 매핑 + 실시간 완료 수신 전환 (로컬)
- 생성 요청을 하드코딩된 workflowId 방식에서 본서비스와 동일한 feature key 매핑 방식으로 전환:
FILM_SHOT_IMAGE_GEN키로 요청하면 백엔드가 매핑된 워크플로우 그룹/variant를 자동 해석. 신규 feature key는 문자열 검증만 통과하면 되므로 백엔드 코드 변경 없이 등록 가능 - 로컬 DB에
FILM_SHOT_IMAGE_GEN → gpt-image 그룹(38c35fa5)매핑 등록(visibility PUBLIC — PRIVATE/ADMIN_ONLY는 일반 유저 생성 불가). jaytsol 계정은 user 권한이라 admin API 대신 DB 직접 등록했으며, 운영은 관리자가POST /v1/workflows/mappings로 등록 필요 - 완료 수신을
/v1/creations반복 폴링에서 본서비스와 동일한/ai-realtimeSocket.IO 이벤트(prompt_progress_update) 방식으로 전환 — 진행률 % 표시, 종결 시 결과를 한 번만 조회, 10분 이벤트 대기 폴백.resolveRealtimeOrigin의 로컬 폴백이 Next.js 오리진으로 향하던 버그도 함께 수정 frontend-vivid-film6bedfc8, lint/빌드 통과
문서 반영
service-planning/09-film-subdomain-plan.md
2026-07-18 (토)
✅ film.surfai.org 서브도메인 서비스 설계 확정
영화적 연출을 위한 촬영 평면도(부감도) 제작 및 영상 생성 연동 서비스를 별도 서브도메인으로 분리하는 설계를 정리했습니다.
- film 프론트엔드는 신규 독립 컨테이너로 분리하고, 백엔드·DB·포인트(VT)는 기존 서비스를 공유하는 것으로 정리
- 서브도메인 SSO는 인증 쿠키의
Domain속성 공유 방식으로 확정하고, 환경변수AUTH_COOKIE_DOMAIN(dev:.dev.surfai.org, prod:.surfai.org)으로 환경별 격리를 명시 - 도메인별 same-origin
/api프록시를 유지해 CORS 변경 없이 연동하는 것으로 정리 - 전체 로드맵에 film.surfai.org 단계(1~4단계) 추가
문서 반영
service-planning/09-film-subdomain-plan.mdproject-overview/02-planning/ROADMAP.md