{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "urn:malfoy-meme-kit:pipeline:state_schema", "title": "MalfoyState", "description": "악역영애 말포이 5편 파이프라인 State. x-reducer = 병렬 노드 동시 쓰기 병합 규칙(state.py와 1:1), x-writers/x-readers = pipeline.yaml 노드 reads/writes에서 생성", "type": "object", "properties": { "brief": { "type": "object", "description": "밈 리서치·레퍼런스", "properties": { "reference": { "type": "object", "description": "레퍼런스 릴스(파일·분석)" }, "meme_research": { "type": "string", "description": " 기준 상대경로" }, "flow_research": { "type": "string", "description": " 기준 상대경로" }, "pinterest": { "type": "object", "description": "수집 폴더·NOTES·장수" } }, "additionalProperties": false, "x-reducer": { "name": "merge_dict", "rule": "딕셔너리 얕은 병합(뒤가 이김)" }, "x-writers": [ "ref", "r_meme", "r_flow", "r_pin" ], "x-readers": [ "sb", "sb3", "img_design", "flow_test" ], "x-subkeys": { "reference": { "writers": [ "ref" ], "readers": [ "sb", "img_design" ] }, "meme_research": { "writers": [ "r_meme" ], "readers": [ "sb" ] }, "flow_research": { "writers": [ "r_flow" ], "readers": [ "sb", "flow_test" ] }, "pinterest": { "writers": [ "r_pin" ], "readers": [ "sb", "sb3", "img_design" ] } } }, "plan": { "type": "object", "description": "storyboard·EDL·박 격자·배치 정의", "properties": { "episodes": { "type": "object", "additionalProperties": { "$ref": "#/$defs/Episode" } }, "storyboard": { "type": "object", "description": "편별 컷 표(시간·마디·화면·소스·오디오)" }, "edl": { "type": "object", "description": "편별 편집 결정표(레이어·자막 위치·SFX 시각)" }, "beat_grid": { "type": "object", "description": "편별 계획 박 격자", "additionalProperties": { "$ref": "#/$defs/BeatGrid" } }, "image_batches": { "type": "object", "description": "배치 노드 id → jsonl 행 목록", "additionalProperties": { "type": "array", "items": { "type": "object" } } }, "flow_jobs": { "type": "object", "description": "배치 노드 id → *_jobs.json 잡 목록", "additionalProperties": { "type": "array", "items": { "type": "object" } } }, "credit_plan": { "type": "object", "description": "크레딧 예산표" } }, "additionalProperties": false, "x-reducer": { "name": "merge_dict", "rule": "딕셔너리 얕은 병합(뒤가 이김)" }, "x-writers": [ "sb", "sb3", "c_v4" ], "x-readers": [ "sb3", "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "mo_a", "mo_b", "mo_c", "c_v1", "c_v3o", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "pr_P1", "pr_P2", "graph" ], "x-subkeys": { "episodes": { "writers": [ "sb" ], "readers": [] }, "storyboard": { "writers": [ "sb", "sb3" ], "readers": [ "sb3", "au_v1_bgm", "au_v1_vo", "au_v3_song", "au_v3_vo", "mo_a", "mo_b", "mo_c", "c_v3o", "graph" ] }, "edl": { "writers": [ "sb", "c_v4" ], "readers": [ "au_v1_sfx", "mo_a", "c_v1", "lay_v1", "lay_v2", "lay_v3", "lay_v4" ] }, "beat_grid": { "writers": [ "sb", "sb3" ], "readers": [ "au_v1_bgm", "au_v3_song", "au_v4" ] }, "image_batches": { "writers": [ "sb", "sb3" ], "readers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "pr_P1" ] }, "flow_jobs": { "writers": [ "sb", "sb3" ], "readers": [ "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "pr_P2" ] }, "credit_plan": { "writers": [ "sb" ], "readers": [] } } }, "rules": { "type": "array", "description": "누적 제약(사용자 반려·사고 교훈) — 이후 전 노드 적용", "items": { "$ref": "#/$defs/Rule" }, "x-reducer": { "name": "upsert_by_id", "rule": "리스트, 같은 id면 필드 병합 아니면 추가" }, "x-writers": [ "flow_test", "user_review" ], "x-readers": [ "r_meme", "r_flow", "r_pin", "sb", "sb3", "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song", "mo_a", "mo_b", "mo_c", "c_v1", "c_v2", "c_v2_fix", "c_v3", "c_v4", "c_v5", "pr_P4" ] }, "assets": { "type": "object", "description": "이미지·클립·매트 (id → 레코드)", "properties": { "images": { "type": "object", "additionalProperties": { "$ref": "#/$defs/ImageRec" } }, "clips": { "type": "object", "additionalProperties": { "$ref": "#/$defs/ClipRec" } }, "mattes": { "type": "object", "additionalProperties": { "$ref": "#/$defs/MatteRec" } } }, "additionalProperties": false, "x-reducer": { "name": "merge_nested_by_id", "rule": "하위 맵마다 merge_by_id" }, "x-writers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "matte_q1", "matte_q2", "matte_q4" ], "x-readers": [ "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "matte_rd", "matte_q1", "matte_q2", "matte_q4", "mo_c", "c_v1", "c_v2", "c_v3", "c_v4", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "pr_P1", "pr_P2", "wire_prev" ], "x-subkeys": { "images": { "writers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix" ], "readers": [ "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "c_v3", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "pr_P1", "wire_prev" ] }, "clips": { "writers": [ "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4" ], "readers": [ "matte_rd", "matte_q1", "matte_q2", "matte_q4", "mo_c", "c_v3", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "pr_P2", "wire_prev" ] }, "mattes": { "writers": [ "matte_q1", "matte_q2", "matte_q4" ], "readers": [ "c_v1", "c_v2", "c_v3", "c_v4", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "lay_v1", "lay_v2", "lay_v3", "lay_v4" ] } } }, "audio": { "type": "object", "description": "곡·VO·SFX·박 실측·후보", "properties": { "tracks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/Track" } }, "vo": { "type": "object", "additionalProperties": { "$ref": "#/$defs/VoTake" } }, "sfx": { "type": "object", "additionalProperties": { "$ref": "#/$defs/SfxRec" } }, "beats": { "type": "object", "additionalProperties": { "$ref": "#/$defs/BeatGrid" } }, "candidates": { "type": "object", "additionalProperties": { "$ref": "#/$defs/Track" } } }, "additionalProperties": false, "x-reducer": { "name": "merge_nested_by_id", "rule": "하위 맵마다 merge_by_id" }, "x-writers": [ "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song" ], "x-readers": [ "au_v5_song", "mo_b", "c_v1", "c_v2", "c_v3o", "c_v3", "c_v4", "c_v5", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "pr_P3", "wire_prev" ], "x-subkeys": { "tracks": { "writers": [ "au_v1_bgm", "au_v3_song", "au_v4", "au_v5_song" ], "readers": [ "au_v5_song", "c_v1", "c_v2", "c_v3o", "c_v3", "c_v4", "c_v5", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "pr_P3", "wire_prev" ] }, "vo": { "writers": [ "au_v1_vo", "au_v3_vo" ], "readers": [ "c_v1", "c_v3o", "c_v3", "pr_P3" ] }, "sfx": { "writers": [ "au_v1_sfx", "au_v4" ], "readers": [ "c_v1", "c_v4", "pr_P3" ] }, "beats": { "writers": [ "au_v1_bgm", "au_v3_song", "au_v4", "au_v5_song" ], "readers": [ "au_v5_song", "mo_b", "c_v1", "c_v3o", "c_v3", "c_v4", "c_v5" ] }, "candidates": { "writers": [ "au_v1_bgm", "au_v1_vo", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song" ], "readers": [ "pr_P3" ] } } }, "blocks": { "type": "object", "description": "코드 배경·오버레이 블록 (id → Block)", "additionalProperties": { "$ref": "#/$defs/Block" }, "x-reducer": { "name": "merge_by_id", "rule": "id → 레코드, 레코드끼리 필드 병합" }, "x-writers": [ "mo_a", "mo_b", "mo_c", "c_v3o" ], "x-readers": [ "mo_b", "mo_c", "c_v1", "c_v2", "c_v3", "c_v4", "c_v5", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "lay_v1", "lay_v2", "lay_v3", "lay_v4" ] }, "renders": { "type": "object", "description": "편별 패스·드래프트·최종·업로드본·컨택트시트 (V1~V5 → RenderRec)", "additionalProperties": { "$ref": "#/$defs/RenderRec" }, "propertyNames": { "enum": [ "V1", "V2", "V3", "V4", "V5" ] }, "x-reducer": { "name": "merge_by_id", "rule": "id → 레코드, 레코드끼리 필드 병합" }, "x-writers": [ "c_v1", "c_v2", "c_v2_fix", "c_v3", "c_v4", "c_v5", "user_review" ], "x-readers": [ "c_v2_fix", "c_v5", "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "wire_prev" ] }, "qa": { "type": "object", "description": "판정 결과·재시도 횟수·게이트 상태", "properties": { "verdicts": { "type": "array", "description": "판정 로그(리스트 누적)", "items": { "$ref": "#/$defs/Verdict" } }, "retries": { "type": "object", "description": "노드/아이템 → 재시도 횟수(합산)", "additionalProperties": { "type": "integer", "minimum": 0 } }, "gates": { "type": "object", "description": "노드 → 게이트 상태(덮어쓰기)", "additionalProperties": { "$ref": "#/$defs/GateState" } } }, "additionalProperties": false, "x-reducer": { "name": "merge_qa", "rule": "verdicts 리스트 누적 · retries 합산 · gates 덮어쓰기" }, "x-writers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song", "c_v1", "c_v2", "c_v3", "c_v4", "c_v5", "fx_merge", "pr_merge", "news_JA", "news_JB" ], "x-readers": [ "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6", "news_merge" ], "x-subkeys": { "verdicts": { "writers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song", "c_v1", "c_v2", "c_v3", "c_v4", "c_v5", "fx_merge", "pr_merge", "news_JA", "news_JB" ], "readers": [ "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6", "news_merge" ] }, "retries": { "writers": [ "img_design", "img_frames", "img_outfits", "img_s6", "img_v3", "img_fix", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v3_song", "au_v4", "au_v5_song", "c_v1", "c_v2", "c_v3", "c_v4", "c_v5" ], "readers": [] }, "gates": { "writers": [], "readers": [] } } }, "feedback": { "type": "array", "description": "사용자 반려 큐(quote·target_node·status)", "items": { "$ref": "#/$defs/Feedback" }, "x-reducer": { "name": "upsert_by_id", "rule": "리스트, 같은 id면 필드 병합 아니면 추가" }, "x-writers": [ "user_review" ], "x-readers": [ "sb", "au_v5_song", "c_v2_fix", "pr_P4", "graph", "news_merge", "wire" ] }, "budget": { "type": "object", "description": "Flow·ElevenLabs·codex 원장", "properties": { "flow_credits": { "$ref": "#/$defs/Ledger" }, "eleven_credits": { "$ref": "#/$defs/Ledger" }, "codex": { "$ref": "#/$defs/Ledger" } }, "additionalProperties": false, "x-reducer": { "name": "merge_budget", "rule": "원장별 spent 합산 · entries 누적 · start/cap 덮어쓰기" }, "x-writers": [ "sb", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song" ], "x-readers": [ "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ], "x-subkeys": { "flow_credits": { "writers": [ "sb", "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4" ], "readers": [ "flow_test", "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] }, "eleven_credits": { "writers": [ "sb", "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song" ], "readers": [ "au_v1_bgm", "au_v1_vo", "au_v1_sfx", "au_v3_song", "au_v3_vo", "au_v4", "au_v5_song", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] }, "codex": { "writers": [], "readers": [ "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] } } }, "runtime": { "type": "object", "description": "동시성 슬롯·heavy 세마포어·도구 설정·장애/재개 로그·실행 trace", "properties": { "slots": { "type": "object", "description": "슬롯 이름 → 상한", "additionalProperties": { "type": "integer", "minimum": 1 } }, "heavy": { "type": "object", "description": "heavy.sh 세마포어 상태", "properties": { "limit": { "type": "integer" }, "in_use": { "type": "integer", "minimum": 0 }, "script": { "type": "string", "description": " 기준 상대경로" } } }, "toolchain": { "type": "object", "description": "도구 설정(FLOW-UI·matte backend·render workers)" }, "incidents": { "type": "array", "items": { "type": "object", "properties": { "ts": { "type": "string" }, "what": { "type": "string" }, "fix": { "type": "string" } } } }, "resume_log": { "type": "array", "items": { "type": "object" } }, "trace": { "type": "array", "description": "실행된 노드 id 순서(리스트 누적)", "items": { "type": "string" } } }, "additionalProperties": false, "x-reducer": { "name": "merge_runtime", "rule": "trace·incidents·resume_log 누적 · slots·heavy·toolchain 병합" }, "x-writers": [ "flow_test", "matte_rd", "matte_gpu", "matte_q1", "matte_q2", "matte_q4", "gpu_render", "sema", "<모든 노드: runtime.trace>" ], "x-readers": [ "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "matte_gpu", "matte_q1", "matte_q2", "matte_q4", "gpu_render", "c_v1", "c_v2", "c_v3", "c_v4", "c_v5", "sema", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ], "x-subkeys": { "slots": { "writers": [ "sema" ], "readers": [ "matte_q1", "matte_q2", "matte_q4" ] }, "heavy": { "writers": [ "sema" ], "readers": [ "c_v1", "c_v2", "c_v3", "c_v4", "c_v5" ] }, "toolchain": { "writers": [ "flow_test", "matte_rd", "matte_gpu", "gpu_render" ], "readers": [ "flow_b_v1", "flow_b_ref", "flow_b_extra", "flow_b_v3", "flow_b_v4", "matte_gpu", "matte_q1", "matte_q2", "matte_q4", "gpu_render", "sema", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] }, "incidents": { "writers": [ "matte_q1", "matte_q2", "matte_q4" ], "readers": [ "sema", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] }, "resume_log": { "writers": [], "readers": [ "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6" ] }, "trace": { "writers": [], "readers": [] } } }, "docs": { "type": "object", "description": "설명 산출물 (id → Doc)", "additionalProperties": { "$ref": "#/$defs/Doc" }, "x-reducer": { "name": "merge_by_id", "rule": "id → 레코드, 레코드끼리 필드 병합" }, "x-writers": [ "fx_A", "fx_B", "fx_C", "fx_D", "fx_E", "fx_merge", "lay_v1", "lay_v2", "lay_v3", "lay_v4", "lay_merge", "pr_P1", "pr_P2", "pr_P3", "pr_P4", "pr_merge", "pipe_T1", "pipe_T2", "pipe_T3", "pipe_T4", "pipe_T5", "pipe_T6", "pipe_merge", "graph", "news_S1", "news_S2", "news_S3", "news_S4", "news_S5", "news_S6", "news_merge", "wire", "wire_prev" ], "x-readers": [ "fx_merge", "lay_merge", "pr_merge", "pipe_merge", "graph", "news_S1", "news_S2", "news_S3", "news_S4", "news_S5", "news_S6", "news_JA", "news_JB", "news_merge", "wire" ] } }, "additionalProperties": false, "$defs": { "ImageRec": { "type": "object", "description": "codex 이미지 1장", "required": [ "id", "final_file" ], "properties": { "id": { "type": "string" }, "batch": { "type": "string", "description": "생성 노드 id(img_frames 등)" }, "used_in": { "type": "array", "description": "편·컷", "items": { "type": "string" } }, "model": { "type": "string" }, "size": { "type": "string", "pattern": "^\\d+x\\d+$" }, "refs": { "type": "array", "description": "참조 이미지(-i 첨부)", "items": { "type": "string", "description": " 기준 상대경로" } }, "prompt": { "type": "string" }, "file": { "type": "string", "description": " 기준 상대경로" }, "final_file": { "$ref": "#/$defs/Path", "description": "이름 교정 반영 후 실제 파일" }, "status": { "type": "string", "enum": [ "pending", "ok", "timeout", "failed", "renamed" ] }, "elapsed_s": { "type": "number" }, "attempt": { "type": "integer", "minimum": 1, "maximum": 2 } } }, "ClipRec": { "type": "object", "description": "Flow 클립 1개", "required": [ "id", "mode" ], "properties": { "id": { "type": "string" }, "batch": { "type": "string" }, "mode": { "type": "string", "enum": [ "first_frame", "first_last", "ingredients" ] }, "first_frame": { "type": "string", "description": " 기준 상대경로" }, "last_frame": { "type": "string", "description": " 기준 상대경로" }, "refs": { "type": "array", "items": { "type": "string" } }, "seconds": { "type": "integer", "enum": [ 4, 6, 8 ] }, "resolution": { "type": "string", "enum": [ "360p", "720p" ] }, "aspect": { "type": "string", "enum": [ "9:16" ] }, "prompt": { "type": "string" }, "result_file": { "type": "string", "description": " 기준 상대경로" }, "credits": { "type": "integer", "minimum": 0 }, "verdict": { "type": "string", "enum": [ "채택", "채택(주의)", "regen", "불합격", "pending" ] }, "verdict_note": { "type": "string" }, "regen_count": { "type": "integer", "minimum": 0, "maximum": 1 }, "blue_bg": { "type": "boolean", "description": "블루 합성 컷(매팅 대상)이면 true, 인월드면 false" } } }, "MatteRec": { "type": "object", "description": "알파 매트 1개", "required": [ "clip_id", "file" ], "properties": { "clip_id": { "type": "string" }, "file": { "type": "string", "description": " 기준 상대경로" }, "qc": { "type": "string", "description": " 기준 상대경로" }, "backend": { "type": "string", "enum": [ "gpu", "cpu", "hybrid" ] }, "sec_per_frame": { "type": "number" }, "status": { "type": "string", "enum": [ "queued", "part", "done", "failed" ] } } }, "Track": { "type": "object", "description": "곡 마스터/후보", "required": [ "id", "file" ], "properties": { "id": { "type": "string" }, "episode": { "type": "string", "description": "편 id", "enum": [ "V1", "V2", "V3", "V4", "V5" ] }, "file": { "type": "string", "description": " 기준 상대경로" }, "source": { "type": "string" }, "request": { "type": "string", "description": " 기준 상대경로" }, "bpm": { "type": "number" }, "lufs": { "type": "number" }, "trim_from_raw_s": { "type": "number" }, "chosen": { "type": "boolean" }, "lang": { "type": "string", "enum": [ "instrumental", "ko", "en" ] }, "metrics": { "type": "object" } } }, "VoTake": { "type": "object", "description": "대사 테이크", "required": [ "line_id", "file" ], "properties": { "line_id": { "type": "string" }, "episode": { "type": "string", "description": "편 id", "enum": [ "V1", "V2", "V3", "V4", "V5" ] }, "voice_name": { "type": "string" }, "voice_id": { "type": "string", "description": "ElevenLabs voice id(비밀 아님)" }, "model": { "type": "string" }, "text_with_tags": { "type": "string" }, "file": { "type": "string", "description": " 기준 상대경로" }, "asr": { "type": "string" }, "status": { "type": "string", "enum": [ "final", "alt", "rejected" ] } } }, "SfxRec": { "type": "object", "description": "효과음", "required": [ "id", "file" ], "properties": { "id": { "type": "string" }, "prompt": { "type": "string" }, "duration": { "type": "number" }, "file": { "type": "string", "description": " 기준 상대경로" } } }, "BeatGrid": { "type": "object", "description": "박 격자(계획 또는 실측)", "properties": { "file": { "type": "string", "description": " 기준 상대경로" }, "bpm": { "type": "number" }, "beat_period_s": { "type": "number" }, "drop_s": { "type": "number" }, "big_hits_s": { "type": "array", "items": { "type": "number" } }, "bars": { "type": "integer" }, "source": { "type": "string", "enum": [ "plan", "measured" ] } } }, "Block": { "type": "object", "description": "코드 배경·오버레이 블록(HyperFrames composition)", "required": [ "id", "file" ], "properties": { "id": { "type": "string" }, "file": { "type": "string", "description": " 기준 상대경로" }, "worker": { "type": "string", "enum": [ "A", "B", "C", "v3o" ] }, "vars": { "type": "object", "description": "layer(bg/fg)·박 상수 등" }, "techniques": { "type": "array", "description": "awesome-ai-motion slug", "items": { "type": "string" } }, "lint": { "type": "string", "enum": [ "pass", "fail", "pending" ] } } }, "RenderRec": { "type": "object", "description": "편별 render 묶음", "properties": { "episode": { "type": "string", "description": "편 id", "enum": [ "V1", "V2", "V3", "V4", "V5" ] }, "passes": { "type": "array", "description": "pass_bg.mp4·pass_fg.mov·bgchar.mp4·plates.mp4 등", "items": { "type": "string", "description": " 기준 상대경로" } }, "drafts": { "type": "array", "description": "draft_540p·r1~r3", "items": { "type": "string", "description": " 기준 상대경로" } }, "final": { "type": "string", "description": " 기준 상대경로" }, "upload": { "type": "string", "description": " 기준 상대경로" }, "contact": { "type": "string", "description": " 기준 상대경로" }, "duration_s": { "type": "number" }, "lufs": { "type": "number" }, "round": { "type": "integer", "minimum": 1 }, "status": { "type": "string", "enum": [ "building", "draft", "final", "approved", "rejected" ] }, "reviewed": { "type": "boolean" } } }, "Verdict": { "type": "object", "description": "판정 1건", "required": [ "node", "verdict" ], "properties": { "node": { "type": "string" }, "target": { "type": "string", "description": "판정 대상 id(컷·파일·섹션)" }, "verdict": { "type": "string", "enum": [ "pass", "fail", "retry", "warn" ] }, "reason": { "type": "string" }, "round": { "type": "integer", "minimum": 1 }, "evidence": { "type": "string", "description": " 기준 상대경로" } } }, "GateState": { "type": "object", "description": "게이트 현재 상태(라우터가 읽음)", "required": [ "status" ], "properties": { "status": { "type": "string", "enum": [ "pass", "retry", "blocked" ] }, "round": { "type": "integer", "minimum": 1 }, "retry_items": { "type": "array", "items": { "type": "string" } } } }, "Feedback": { "type": "object", "description": "사용자 반려 1건", "required": [ "id", "quote", "target_node", "status" ], "properties": { "id": { "type": "string", "pattern": "^I\\d{2}$|^F-.+$" }, "quote": { "type": "string" }, "target_node": { "type": "string" }, "effect": { "type": "string" }, "rule": { "type": "string" }, "status": { "type": "string", "enum": [ "open", "rewound", "resolved", "rejected" ] }, "at": { "type": "string", "description": "반려 시점 노드/산출물" } } }, "Rule": { "type": "object", "description": "누적 제약", "required": [ "id", "text" ], "properties": { "id": { "type": "string" }, "text": { "type": "string" }, "source": { "type": "string", "description": "feedback id 또는 사고 id" }, "scope": { "type": "string" } } }, "Ledger": { "type": "object", "description": "크레딧 원장(spent는 합산 reducer)", "properties": { "start": { "type": "number" }, "cap": { "type": [ "number", "string" ] }, "spent": { "type": "number", "minimum": 0 }, "entries": { "type": "array", "items": { "type": "object", "properties": { "node": { "type": "string" }, "amount": { "type": "number" }, "note": { "type": "string" } } } } } }, "Doc": { "type": "object", "description": "설명 산출물", "required": [ "id", "path" ], "properties": { "id": { "type": "string" }, "path": { "type": "string", "description": " 기준 상대경로" }, "kind": { "type": "string", "enum": [ "section", "merged", "verdict", "asset" ] }, "lines": { "type": "integer" }, "status": { "type": "string" } } }, "Path": { "type": "string", "description": " 기준 상대경로" }, "Episode": { "type": "object", "description": "편 메타", "properties": { "id": { "type": "string", "description": "편 id", "enum": [ "V1", "V2", "V3", "V4", "V5" ] }, "title": { "type": "string" }, "duration_s": { "type": "number" }, "bpm": { "type": "number" }, "next": { "type": [ "string", "null" ] } } } } }