Skip to content

feat(content-studio): Video Generation Pipeline — AI 영상 합성 통합#592

Merged
thxforall merged 15 commits into
devfrom
feature/508-content-studio-video-pipeline
May 28, 2026
Merged

feat(content-studio): Video Generation Pipeline — AI 영상 합성 통합#592
thxforall merged 15 commits into
devfrom
feature/508-content-studio-video-pipeline

Conversation

@thxforall
Copy link
Copy Markdown
Contributor

Summary

Content Studio가 텍스트 스크립트(voiceover + scene direction)까지만 생성하던 것을 실제 영상 합성(video synthesis) 까지 자동화하도록 확장. 14 commits로 video provider 추상화, scene별 video mode 선택, OpenAI image bridge, 합성 export, governance/cost tracking, local video runner 등 영상 파이프라인 전반 구축.

주요 변경 (커밋 그룹별)

Provider 추상화 — Closes #519

  • feat(content-studio): abstract video providers — provider-agnostic 인터페이스
  • feat(content-studio): add video job pipeline — job 큐/상태 관리

Mode/Image bridge — Closes #522

  • feat(content-studio): select video mode per scene — scene별 video mode 선택
  • feat(content-studio): add xAI scene video pipeline — Grok Imagine 통합

Export compose — Closes #523

  • feat(content-studio): compose final video exports — scene clips → vertical export
  • feat(content-studio): compose local video clips
  • fix(content-studio): split long local video scenes

Governance/Cost — Closes #524

  • feat(content-studio): attach governance to video jobs — governance checks
  • (cost tracking은 job 메타데이터에 포함)

Job 관리 / 운영

  • feat(content-studio): resume persisted video jobs — 중단된 job 재개
  • feat(content-studio): add local video download runner
  • feat(content-studio): save source image for local videos
  • fix(content-studio): strengthen short-form video prompts

문서

  • docs(content-studio): plan video job pipeline
  • docs(content-studio): harden video job plan

Test plan

  • cd packages/web && bun test — content-studio 관련 신규 단위 테스트
  • 로컬 dev에서 Content Studio → Short Form Builder 진입 → scene별 video mode 선택 → 합성 export 동작 확인
  • xAI provider 키 등록 후 1-scene 실 영상 생성 dry-run
  • persisted job interrupt → restart 시 resume 동작
  • governance check 실패 케이스 (제한 콘텐츠) → job rejected 확인
  • cost 누적 view 노출 (admin/studio)

Breaking changes

  • Content Studio Short Form payload 스키마에 영상 필드 추가
  • 신규 video provider env 필요 (xAI API key 등) — 미설정 시 영상 생성 비활성, 텍스트 모드는 유지

마이그레이션 / 운영

  • video job 메타 저장 테이블 (있다면) — Supabase migration 적용 필요
  • xAI / video provider secret 등록 (X_AI_API_KEY 등)
  • governance rule / cost 정책 별도 정의 가능

Linked issues

위험 / Follow-up

  • 35 commits behind dev였던 상태 → merge: sync with dev (606471c) 로 동기화 완료
  • 14 commits 단일 PR이라 review 부담 큼 — 가능하면 PR description의 그룹 단위로 검토 권장
  • Vercel preview에서 영상 생성 실 동작은 provider env 없이 fail 가능 (예상된 동작)
  • 로컬 build 검증은 agent timeout으로 미완료 — Vercel build로 1차 검증

🤖 Generated with Claude Code

@vercel
Copy link
Copy Markdown

vercel Bot commented May 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
decoded-app Building Building Preview, Comment May 28, 2026 6:34am

@thxforall thxforall moved this from Todo to In Progress in decoded-monorepo May 28, 2026
@thxforall thxforall merged commit 20279d0 into dev May 28, 2026
6 of 9 checks passed
@thxforall thxforall deleted the feature/508-content-studio-video-pipeline branch May 28, 2026 06:39
@github-project-automation github-project-automation Bot moved this from In Progress to Done in decoded-monorepo May 28, 2026
thxforall added a commit that referenced this pull request May 28, 2026
* feat(content-studio): add xAI scene video pipeline

* docs(content-studio): plan video job pipeline

* docs(content-studio): harden video job plan

* feat(content-studio): add video job pipeline

* feat(content-studio): abstract video providers

* feat(content-studio): select video mode per scene

* feat(content-studio): compose final video exports

* feat(content-studio): resume persisted video jobs

* feat(content-studio): attach governance to video jobs

* fix(content-studio): strengthen short-form video prompts

* feat(content-studio): add local video download runner

* feat(content-studio): save source image for local videos

* fix(content-studio): split long local video scenes

* feat(content-studio): compose local video clips
thxforall added a commit that referenced this pull request May 28, 2026
* feat(ci): schema drift PR gate (TS<->DB) — #373 v2 (#588)

* docs(database): add schema-drift-sot.md SSOT mapping (#373 v2)

TS 상수 ↔ DB CHECK constraint 매핑 SSOT. scripts/check-schema-drift.ts 의
SOT_MAPPINGS 와 함께 갱신한다. v2 PR gate 의 동작/허용 constraint 형식/
의도적 우회(drift-bypass label)/v3 후속 항목(posts.status, generated types)
명시.

* feat(scripts): add check-schema-drift.ts for TS<->DB enum drift (#373 v2)

ts-morph 로 TS 상수 (`export const X = [...] as const`) 값 set 추출 →
psql 로 pg_get_constraintdef 파싱 → set-equality 비교. 세 가지 CHECK
constraint 형식 (status::text=ANY ARRAY, col=ANY ARRAY, IN list) 지원.
drift 1건 이상이면 exit 1, stdout 은 PR comment 용 markdown report.

devDependency: ts-morph@^24.0.0 추가.

* feat(ci): add schema-drift.yml PR gate workflow (#373 v2)

postgres:17 service + postgresql-client-17 + bun install + supabase
migrations 순차 적용 + check-schema-drift.ts 실행 + sticky PR comment
(marocchino/sticky-pull-request-comment@v2, header=schema-drift).

drift-bypass label: continue-on-error 로 job green 유지 (comment 는 유지).
branch protection 별도 설정 필요.

* docs(database): drift-check.md mark v2 PR gate landed (#373)

v1 nightly 와 v2 PR gate 채널을 분리 명시. v2 세부는 schema-drift-sot.md
에서 별도 owning.

* docs(design-system): v2.2.0 동기화 — content fundamentals, animations, dual palette (#589)

* docs(design-system): bump README to v2.2.0 with content fundamentals + dual palette

- Version: 2.1.0 -> 2.2.0, Last Updated: 2026-05-28
- Add v2.2 변경사항: Content Fundamentals, Animations 카탈로그, Dual Palette,
  Magazine palette tokens (#573), Navigation Facts, Home sequence,
  IBM Plex Mono (inline), DecodedLogo WebGL
- Document Index: 신규 Foundation (v2.2) 섹션 — content-fundamentals.md,
  animations.md 추가
- Tech Stack table 확장: OKLCH + Hex magazine palette, typography 4종,
  three.js + @chenglou/pretext (DecodedLogo)
- Navigation Facts + Home Page Sequence 섹션 추가 (app/page.tsx:568 앵커)

Closes #572 (part 1/7).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(design-system): add content-fundamentals.md

7 sections covering Voice / Casing / Person / Language / Pricing /
Numbers / Emoji policy with Do/Don't rules and code anchors:

- Pricing: ko-KR locale + ₩ prefix, toLocaleString
  (앵커: DecodedSolutionsSection.tsx:40 — 마이그레이션 대상)
- Numbers: 사용자 표면은 toLocaleString 통과
  (앵커: lib/utils/format.ts:36)
- Voice: editorial(큐레이션) vs product UI(명료) 분리
- Language: ko-KR 기본, 고유명사·기술 용어 원문 유지
- Emoji: editorial 표면 금지, product UI 절제, Lucide 우선

Closes #572 (part 2/7).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(design-system): add animations.md catalog

15+ CSS keyframe catalog with file/line anchors from
packages/web/app/globals.css:

- dash-flow (L299), hologram-* family (L318-L351), spot-* family
  (L410-L458), slide-up (L487), shimmer (L503), ai-summary-* (L522-L535),
  card-glow (L551), marquee-c (L585)
- duration/easing/용도/reduce-motion 컬럼
- Easing 함수 정리: ease-out (단방향 reveal), ease-in-out (펄스),
  linear (무한 flow), cubic-bezier(0.22, 1, 0.36, 1) — observe pattern,
  cubic-bezier(0.16, 1, 0.3, 1) — ai-summary smooth reveal
- prefers-reduced-motion 정책: 4개 미디어 쿼리 블록 + .js-observe
  transition fallback
- 사용 예시: spot 마커, skeleton shimmer, ai-summary, .js-observe

Closes #572 (part 3/7).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(design-system): patterns.md add 5.4 dual palette usage

* docs(design-system): tokens.md add magazine palette sub-table

* docs(agent): rewrite design-system-llm.md as v2.2.0 1-pager SSOT

* docs(agent): design-system-summary.md add v2.2.0 entry

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(content-studio): Video Generation Pipeline — AI 영상 합성 통합 (#592)

* feat(content-studio): add xAI scene video pipeline

* docs(content-studio): plan video job pipeline

* docs(content-studio): harden video job plan

* feat(content-studio): add video job pipeline

* feat(content-studio): abstract video providers

* feat(content-studio): select video mode per scene

* feat(content-studio): compose final video exports

* feat(content-studio): resume persisted video jobs

* feat(content-studio): attach governance to video jobs

* fix(content-studio): strengthen short-form video prompts

* feat(content-studio): add local video download runner

* feat(content-studio): save source image for local videos

* fix(content-studio): split long local video scenes

* feat(content-studio): compose local video clips

* fix(magazines): MAGAZINE_STATUSES — 'generating' 누락 복원 (#373 drift)

DB constraint post_magazines_status_check 는 'generating' 포함 5-state 인데
TS MAGAZINE_STATUSES 는 4-state. 1주일+ 잠재한 schema drift.

#373 drift gate fix (#595) 가 처음 정상 작동하며 발견.

발생 경위:
- 20260430120000: 'generating' 추가 (api-server generate handler 초기 INSERT)
- 20260430150000: 4-state 로 축소 (TS 와 동기화)
- 20260504133842: 'generating' 복원 (api-server insert + UI 필요)
- 마지막 migration 의 TS 동기화 누락 → drift

magazines.ts 의 MAGAZINE_STATUSES 에 'generating' 추가 (DB 와 같은 순서).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
thxforall added a commit that referenced this pull request May 28, 2026
…eo script

Vercel build TS step fail (\`Object literal may only specify known properties,
and 'useResearchInCopy' does not exist in type 'BuildShortFormPlanInput'\`)
해소.

\`buildShortFormPlan\` 의 \`BuildShortFormPlanInput\` type 은
\`{packet, variants, platform, durationSeconds}\` 4개만 받는다.
\`useResearchInCopy\` 는 어디서도 read 되지 않는 dead key — #592 작업 중 남은
leftover. 제거해도 동작 변화 없음.

본 PR (transpilePackages 추가) 와 함께 적용해야 Vercel build green 으로 전환.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
thxforall added a commit that referenced this pull request May 28, 2026
Vercel Hobby plan 의 Serverless Function maxDuration 제한 (1-60s) 위반으로
배포 실패:

\`\`\`
Builder returned invalid maxDuration value for Serverless Function
\"api/v1/content/assets/video-jobs/[jobId]/compose\".
Serverless Functions must have a maxDuration between 1 and 60 for plan hobby.
\`\`\`

수정:
- \`api/v1/content/assets/video-jobs/[jobId]/compose/route.ts\`: 600 → 60
- \`api/v1/content/assets/videos/route.ts\`: 300 → 60

긴 compose/video 작업은 background job 패턴 (\`/poll\` endpoint 와 함께) 으로
처리해야 함. Vercel Pro 업그레이드 시 원래 값 복원 가능 (Pro: 800s 까지).

\#592 Video Pipeline 도입 시 누락된 Hobby 호환성 제약.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
thxforall added a commit that referenced this pull request May 28, 2026
…l build 회복) (#611)

* fix(web): transpilePackages 에 @next/third-parties 추가 (Turbopack Vercel build 회복)

Vercel build (dev/main/feature 전역) 가 \`Module not found: Can't resolve
'@next/third-parties/google'\` 로 실패 중. Turbopack 의 subpath export 해석
회귀이며 vercel/next.js#58697 계열로 reported.

\`transpilePackages\` 에 \`@next/third-parties\` 추가로 Turbopack 의 ESM
resolution 우회. 로컬 \`next build\` 에서 검증 (Compiled successfully in
3.0min, @next/third-parties/google 더 이상 resolve 실패 안 함).

## Why this works

\`transpilePackages\` 는 monorepo 의 workspace 가 아닌 node_modules 패키지를
대상으로도 동작, Next.js 가 해당 모듈을 SWC/Turbopack 으로 transpile 하면서
subpath export 를 정상 풀어낸다.

## Alternative considered

- @next/third-parties pin (next 16.2.1 ↔ @next/third-parties 16.2.6 mismatch)
  → caret range 가 같지만 Bun 이 다르게 resolve. pin 은 lockfile 갱신 부담.
- next 16.2.6 upgrade → minor 영향 범위 커서 보류.

## Related

- vercel/next.js#58697 — @next/third-parties module not found
- handoff session 4: dev/main/feature 전역 Vercel fail 추적

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(content-studio): remove dead useResearchInCopy key from local video script

Vercel build TS step fail (\`Object literal may only specify known properties,
and 'useResearchInCopy' does not exist in type 'BuildShortFormPlanInput'\`)
해소.

\`buildShortFormPlan\` 의 \`BuildShortFormPlanInput\` type 은
\`{packet, variants, platform, durationSeconds}\` 4개만 받는다.
\`useResearchInCopy\` 는 어디서도 read 되지 않는 dead key — #592 작업 중 남은
leftover. 제거해도 동작 변화 없음.

본 PR (transpilePackages 추가) 와 함께 적용해야 Vercel build green 으로 전환.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci: trigger fresh Vercel build (bust cache)

이전 deployment 가 'Restored build cache from previous deployment' 로 진행되어
구 dependency state 가 잔존했을 가능성. empty commit 으로 fresh build 트리거.

* fix(api): cap maxDuration at 60s for video routes (Vercel Hobby limit)

Vercel Hobby plan 의 Serverless Function maxDuration 제한 (1-60s) 위반으로
배포 실패:

\`\`\`
Builder returned invalid maxDuration value for Serverless Function
\"api/v1/content/assets/video-jobs/[jobId]/compose\".
Serverless Functions must have a maxDuration between 1 and 60 for plan hobby.
\`\`\`

수정:
- \`api/v1/content/assets/video-jobs/[jobId]/compose/route.ts\`: 600 → 60
- \`api/v1/content/assets/videos/route.ts\`: 300 → 60

긴 compose/video 작업은 background job 패턴 (\`/poll\` endpoint 와 함께) 으로
처리해야 함. Vercel Pro 업그레이드 시 원래 값 복원 가능 (Pro: 800s 까지).

\#592 Video Pipeline 도입 시 누락된 Hobby 호환성 제약.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant