Skip to main content

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.default Structured 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 | ARCHIVED Plan 생명주기, 확정본 불변·수정본 version·원천 변경 시 새 Attempt 차단·과거 Attempt 보존 규칙 정의
  • ContextRun·ShotRenderPlan 목표 테이블, API 경계, Shot 설계 | 연결 설계 | 생성 준비 화면과 Character Mapping부터 시작하는 구현 순서 문서화

2026-07-30 (목)

Cinema Edit Relation 설계·발행 구현

  • 동일 Scene의 활성 Shot 계획을 기준으로 N개 Shot에 정확히 N-1개의 방향성 인접 관계를 제안하는 cinema.edit-relation.default Structured Output 구현
  • 전환 방식·상세, 관객 추론, 감정 효과, 대비/일치, 정보 공개, 연결 연출 메모와 category/priority 기반 연속성 조건을 구조화
  • 분석 당시 Shot 계획 ID와 Project·Sequence·Scene·Beat·Shot 문맥 hash를 고정하고, 서버에서 AI의 S1 -> S2 key를 실제 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, ProposalSet sourceShotProposalSetId, 동일 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-draft API와 상태·Revision 경계 단위 테스트 추가
  • 승인 취소된 Scene 제안 카드에 제목·행동·기능·장소·시간대·내외부·날씨·등장인물 편집, 분할, 제외, 다시 승인 작업 추가
  • Scene 복원 편집은 동일 ID와 기존 Beat·Shot을 유지하고 미발행 하위 분석 결과를 STALE 처리하며, 분할·제외는 기존 Scene과 Beat·Shot을 복원 불가 이력으로 분리
  • PATCH /v1/cinema/projects/:projectId/sequences/:sequenceId/scenes/:sceneId/restoration-draft API와 Scene 상태·Revision·구조 변경 경계 테스트 추가
  • Cinema 17개 테스트 스위트 76개 테스트, 백엔드·프론트엔드 프로덕션 빌드와 대상 lint 통과

Cinema Beat 개별 복원 구현

  • 정식 Beat의 사용자 직접 보관을 MANUAL, 새 Beat ProposalSet 전체 발행으로 대체된 과거 Beat를 SUPERSEDED로 구분
  • 사용자가 직접 보관한 Beat를 새 행 생성 없이 동일 ID로 다시 활성화하는 복원 API와 원본 Beat 제안 카드의 보관됨 상태·다시 승인 버튼 추가
  • MANUAL 보관 Beat의 제목, 행동, 서사 기능, 감정 전환, 인물별 퍼포먼스, 블로킹을 복원 전에 편집·저장하고 수정된 값으로 다시 승인하는 흐름 추가
  • 과거 발행 묶음의 SUPERSEDED Beat는 개별 복원할 수 없도록 차단해 서로 다른 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.default Structured 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.default Model Profile 구현
  • Beat Proposal 추가·수정·정렬·분할·병합·제외를 지원하고 카메라·렌즈·구도 등 Shot 속성은 Beat 계약에서 제외
  • READY 제안이 Scene 원문 전체를 덮는지 검증한 뒤 기존 활성 Beat를 보관하고 새 묶음을 한 트랜잭션으로 발행. 발행 반복 요청은 기존 결과를 반환하고 STALE 세트 발행은 차단
  • cinema_beat_proposals, cinema_beats, ProposalSet sourceSceneId·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 멱등 저장, Revision characterCount 저장과 본문 없는 목록 조회 적용
  • 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 구현

  • 메인 프론트엔드에 시네마 메뉴, /cinema Project 목록·생성·삭제 화면과 /cinema/:projectId Script 작업공간 추가
  • 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는 CinemaAssetFolderProjectAssetBinding으로 특정 AssetVersion을 고정 참조하도록 정의
  • 공용 Asset의 최신 Version이 바뀌어도 Project Binding은 자동 변경하지 않고 명시적 업그레이드와 참조 Version 보존 정책을 적용

2026-07-24 (금)

📚 Film 서비스 계층형 데이터 모델 문서화

  • Film Service 문서 카테고리를 신설하고, AI 영화 제작 워크스페이스의 제품 정의와 사용자 흐름, Project -> Sequence -> Scene -> Beat/Shot 계층 모델, Beat-Shot Mapping M: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_visible Field Routing과 미래·숨김 정보 차단, 긍정형 현재 상태 중심 Renderer Brief 원칙을 문서화
  • 기본 3-Shot Context Window, 생성 전 Brief 작성과 생성 후 맥락 QA 기준을 추가
  • 쿨레쇼프 효과와 Shot 연결의 관객 추론을 표현하는 Edit Relation 모델, 순서 변경 시 needs_review, Timeline/Edit Relation UI 요구사항을 정의
  • Shot을 Frame DesignMotion 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장으로 확대: 59장은 3x3 그리드(768px 셀, 캔버스 2304x2304)로 합성하고 14장 레이아웃은 기존 그대로 유지
  • frontend-vivid-ai: 시트 빌더 3개(personaStudioReferenceSheet·personaReferenceSheet·styleCreationReferenceSheet)와 생성 호출부(PersonaCreatePanelReferenceGeneration.utils·styleCreationGeneration.helpers)의 slice(0, 4) 상한을 9로 조정, 프리픽스 패널 수 표기를 nine까지 확장
  • frontend-vivid-film: referenceSheet MAX_PANELS 4→9, 인물 5~9명 시 좌측 절반을 3x3 그리드로 합성하고 프리픽스에 그리드 읽기 순서 명시
  • 상세 보기의 분리 참조 미디어 표시는 이미 상한 없이 동작(갤러리 상세 모달·페르소나/스타일 히스토리)함을 확인해 최대 9개까지 그대로 표시
  • frontend-vivid-ai tsc --noEmit·eslint, frontend-vivid-film lint/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-film lint/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, film lint/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, film lint/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-film Next.js 앱 스캐폴드, Dockerfile, GitHub 레포/submodule 등록, docker-compose.dev.ymlfrontend-film 서비스(포트 4100) 추가
  • Shot Designer(Hollywood Camera Work) 분석을 설계 문서에 반영하고 film 프론트엔드 서브모듈을 9개로 확장

문서 반영

  • service-planning/09-film-subdomain-plan.md

✅ film.surfai.org Phase 2 구현 및 운영 도메인 기준 반영

  • frontend-vivid-film에 인증 연동(axios withCredentials + 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-film 25425ab)

문서 반영

  • 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-film 66df8eb, 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-realtime Socket.IO 이벤트(prompt_progress_update) 방식으로 전환 — 진행률 % 표시, 종결 시 결과를 한 번만 조회, 10분 이벤트 대기 폴백. resolveRealtimeOrigin의 로컬 폴백이 Next.js 오리진으로 향하던 버그도 함께 수정
  • frontend-vivid-film 6bedfc8, 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.md
  • project-overview/02-planning/ROADMAP.md