feat: define video workflow contracts and templates
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"brief": {
|
||||
"topic": "",
|
||||
"language": ""
|
||||
},
|
||||
"settings": {
|
||||
"aspect_ratio": "9:16",
|
||||
"max_duration_ms": 180000,
|
||||
"max_cut_duration_ms": 5000,
|
||||
"style_reference": "references/1.png",
|
||||
"tts_engine": "Qwen3-TTS",
|
||||
"conda_env": "qwen3-tts",
|
||||
"image_model": "gpt-image-2.5-sunburst"
|
||||
},
|
||||
"stages": [
|
||||
{
|
||||
"stage_id": "01-topic",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "02-research",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "03-script",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "04-title",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "05-tts-split",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "06-tts",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "07-cuts",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "08-scenes",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "09-entities",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "10-references",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "11-images",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "12-motion",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "13-compose",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
},
|
||||
{
|
||||
"stage_id": "14-review",
|
||||
"status": "pending",
|
||||
"revision": null,
|
||||
"artifact_path": null,
|
||||
"issues": []
|
||||
}
|
||||
],
|
||||
"reviews": [
|
||||
{
|
||||
"review_id": "topic",
|
||||
"decision": "pending",
|
||||
"artifact_refs": [],
|
||||
"feedback": ""
|
||||
},
|
||||
{
|
||||
"review_id": "story",
|
||||
"decision": "pending",
|
||||
"artifact_refs": [],
|
||||
"feedback": ""
|
||||
},
|
||||
{
|
||||
"review_id": "scenes",
|
||||
"decision": "pending",
|
||||
"artifact_refs": [],
|
||||
"feedback": ""
|
||||
},
|
||||
{
|
||||
"review_id": "final",
|
||||
"decision": "pending",
|
||||
"artifact_refs": [],
|
||||
"feedback": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
# 단계 결과 검토
|
||||
|
||||
## 검토 대상
|
||||
|
||||
- 제작 ID:
|
||||
- 검토 ID와 결과 버전: topic / story / scenes / final 중 해당 검토와 stage_id·revision
|
||||
- JSON 위치:
|
||||
- 현재 상태와 확인하지 못한 내용:
|
||||
- 사용자의 선택·피드백: 실제 응답 후 기록
|
||||
|
||||
JSON을 기준으로 요약하며 문서만 고쳐 승인 내용을 바꾸지 않는다. 이 양식은 결과·사용자 검토를 돕는 문서이고 자체 승인이 아니다. 검토 구분이 없는 중간 결과는 해당 없음으로 적는다.
|
||||
|
||||
## 결과와 다음 진행
|
||||
|
||||
- 핵심 결과:
|
||||
- 근거와 선행 버전:
|
||||
- 완료 조건 충족 여부와 남은 문제:
|
||||
- 사용자에게 필요한 결정:
|
||||
- 결정에 따른 다음 작업 또는 돌아갈 단계:
|
||||
|
||||
## 제작 지침 적용
|
||||
|
||||
[제작 지침서](../docs/short-video-guide.md)의 해당 단계 메모만 사용한다. 이 링크는 templates 위치 기준이다. 실제 제작 폴더로 복사할 때 저장소의 docs/short-video-guide.md를 가리키도록 문서 링크를 조정한다. JSON 내부 경로는 항상 저장소 루트 기준이다.
|
||||
|
||||
- 적용한 구성 원칙과 실제 결과:
|
||||
- 소재에 맞지 않아 적용하지 않은 구성과 이유:
|
||||
|
||||
story 검토에는 중심 질문·답, 제목과 첫 문장의 약속, 답하는 블록, 블록 연결, 핵심 주장·출처, 비유의 한계와 덜어낸 내용을 적는다.
|
||||
|
||||
scenes 검토에는 컷 ID·실측 음성 구간, 이해할 내용, 시작→끝 변화, 화면·연결 선택 이유, 인물·배경·근거 참조, 주석·숫자의 근거와 모바일 초점을 적는다.
|
||||
|
||||
final 검토에는 story/visual/audio/captions/timing/consistency별 실제 파일·시간·청취·관찰 근거와 수정할 단계·컷을 적는다. JSON의 checks.evidence·findings와 일치시키고 미검수는 not_checked, 완성본 부재는 incomplete로 남긴다.
|
||||
|
||||
## 수정과 보존
|
||||
|
||||
- 새 버전에서 바뀐 내용:
|
||||
- 영향을 받는 후속 결과·검토:
|
||||
- 그대로 사용할 기존 결과와 이유:
|
||||
- 이전 버전의 위치:
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "01-topic",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"candidates": [],
|
||||
"selected_id": null,
|
||||
"selection_reason": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "02-research",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"sources": [],
|
||||
"claims": [],
|
||||
"open_questions": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "03-script",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"blocks": [],
|
||||
"full_text": "",
|
||||
"estimated_duration_ms": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "04-title",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"candidates": [],
|
||||
"selected_id": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "05-tts-split",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"units": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "06-tts",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"request": {
|
||||
"engine": "Qwen3-TTS",
|
||||
"conda_env": "qwen3-tts",
|
||||
"language": "",
|
||||
"units": []
|
||||
},
|
||||
"result": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "07-cuts",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"narration_duration_ms": null,
|
||||
"timing_evidence": "",
|
||||
"cuts": [],
|
||||
"captions": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "08-scenes",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"scenes": [],
|
||||
"connections": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "09-entities",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"characters": [],
|
||||
"backgrounds": [],
|
||||
"appearances": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "10-references",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"request": {
|
||||
"model": "gpt-image-2.5-sunburst",
|
||||
"style_reference": "references/1.png",
|
||||
"items": []
|
||||
},
|
||||
"result": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "11-images",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"request": {
|
||||
"model": "gpt-image-2.5-sunburst",
|
||||
"frames": []
|
||||
},
|
||||
"result": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "12-motion",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"request": {
|
||||
"clips": []
|
||||
},
|
||||
"result": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "13-compose",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"request": {
|
||||
"timeline": [],
|
||||
"narration_path": "",
|
||||
"captions": [],
|
||||
"title": ""
|
||||
},
|
||||
"result": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project_id": "video-001",
|
||||
"stage_id": "14-review",
|
||||
"revision": 1,
|
||||
"inputs": [],
|
||||
"payload": {
|
||||
"checks": [
|
||||
{
|
||||
"area": "story",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"area": "visual",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"area": "audio",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"area": "captions",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"area": "timing",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"area": "consistency",
|
||||
"verdict": "not_checked",
|
||||
"evidence": ""
|
||||
}
|
||||
],
|
||||
"findings": [],
|
||||
"recommendation": "incomplete"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user