{ "type": "object", "properties": { "schema_version": { "const": "1.0" }, "project_id": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" }, "stage_id": { "enum": [ "01-topic", "02-research", "03-script", "04-title", "05-tts-split", "06-tts", "07-cuts", "08-scenes", "09-entities", "10-references", "11-images", "12-motion", "13-compose", "14-review" ] }, "revision": { "type": "integer", "minimum": 1 }, "inputs": { "type": "array", "items": { "$ref": "#/$defs/stage_ref" }, "uniqueItems": true }, "payload": { "type": "object" } }, "required": [ "schema_version", "project_id", "stage_id", "revision", "inputs", "payload" ], "additionalProperties": false, "$schema": "https://json-schema.org/draft/2020-12/schema", "$defs": { "stage_ref": { "type": "object", "properties": { "stage_id": { "enum": [ "01-topic", "02-research", "03-script", "04-title", "05-tts-split", "06-tts", "07-cuts", "08-scenes", "09-entities", "10-references", "11-images", "12-motion", "13-compose", "14-review" ] }, "revision": { "type": "integer", "minimum": 1 } }, "required": [ "stage_id", "revision" ], "additionalProperties": false }, "issue": { "type": "object", "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "blocking": { "type": "boolean" } }, "required": [ "code", "message", "blocking" ], "additionalProperties": false }, "media": { "type": "object", "properties": { "path": { "type": "string" }, "kind": { "enum": [ "audio", "image", "video" ] }, "verified": { "type": "boolean" }, "duration_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "width": { "type": [ "integer", "null" ], "minimum": 1 }, "height": { "type": [ "integer", "null" ], "minimum": 1 } }, "required": [ "path", "kind", "verified", "duration_ms", "width", "height" ], "additionalProperties": false, "allOf": [ { "if": { "properties": { "kind": { "const": "audio" } } }, "then": { "properties": { "width": { "type": "null" }, "height": { "type": "null" } } } }, { "if": { "properties": { "kind": { "const": "image" } } }, "then": { "properties": { "duration_ms": { "type": "null" } } } }, { "if": { "properties": { "verified": { "const": true } } }, "then": { "properties": { "path": { "type": "string", "minLength": 1 } }, "allOf": [ { "if": { "properties": { "kind": { "enum": [ "audio", "video" ] } } }, "then": { "properties": { "duration_ms": { "type": "integer", "minimum": 1 } } } }, { "if": { "properties": { "kind": { "enum": [ "image", "video" ] } } }, "then": { "properties": { "width": { "type": "integer", "minimum": 1 }, "height": { "type": "integer", "minimum": 1 } } } } ] } } ] }, "unit": { "type": "object", "properties": { "id": { "type": "string" }, "block_ids": { "type": "array", "items": { "type": "string" } }, "display_text": { "type": "string" }, "spoken_text": { "type": "string" }, "pronunciation_notes": { "type": "string" } }, "required": [ "id", "block_ids", "display_text", "spoken_text", "pronunciation_notes" ], "additionalProperties": false }, "caption": { "type": "object", "properties": { "id": { "type": "string" }, "start_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "end_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "text": { "type": "string" } }, "required": [ "id", "start_ms", "end_ms", "text" ], "additionalProperties": false }, "01-topic": { "type": "object", "properties": { "candidates": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "angle": { "type": "string" }, "summary": { "type": "string" } }, "required": [ "id", "angle", "summary" ], "additionalProperties": false } }, "selected_id": { "anyOf": [ { "type": "null" }, { "type": "string" } ] }, "selection_reason": { "type": "string" } }, "required": [ "candidates", "selected_id", "selection_reason" ], "additionalProperties": false }, "02-research": { "type": "object", "properties": { "sources": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "url": { "type": "string" }, "publisher": { "type": "string" }, "accessed_at": { "type": "string", "format": "date" } }, "required": [ "id", "title", "url", "publisher", "accessed_at" ], "additionalProperties": false } }, "claims": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "text": { "type": "string" }, "source_ids": { "type": "array", "items": { "type": "string" } }, "assessment": { "enum": [ "verified", "uncertain" ] } }, "required": [ "id", "text", "source_ids", "assessment" ], "additionalProperties": false } }, "open_questions": { "type": "array", "items": { "type": "string" } } }, "required": [ "sources", "claims", "open_questions" ], "additionalProperties": false }, "03-script": { "type": "object", "properties": { "blocks": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "text": { "type": "string" }, "claim_ids": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "text", "claim_ids" ], "additionalProperties": false } }, "full_text": { "type": "string" }, "estimated_duration_ms": { "type": [ "integer", "null" ], "minimum": 0 } }, "required": [ "blocks", "full_text", "estimated_duration_ms" ], "additionalProperties": false }, "04-title": { "type": "object", "properties": { "candidates": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "text": { "type": "string" }, "rationale": { "type": "string" } }, "required": [ "id", "text", "rationale" ], "additionalProperties": false } }, "selected_id": { "anyOf": [ { "type": "null" }, { "type": "string" } ] } }, "required": [ "candidates", "selected_id" ], "additionalProperties": false }, "05-tts-split": { "type": "object", "properties": { "units": { "type": "array", "items": { "$ref": "#/$defs/unit" } } }, "required": [ "units" ], "additionalProperties": false }, "06-tts": { "type": "object", "properties": { "request": { "type": "object", "properties": { "engine": { "const": "Qwen3-TTS" }, "conda_env": { "const": "qwen3-tts" }, "language": { "type": "string" }, "units": { "type": "array", "items": { "$ref": "#/$defs/unit" } } }, "required": [ "engine", "conda_env", "language", "units" ], "additionalProperties": false }, "result": { "anyOf": [ { "type": "null" }, { "type": "object", "properties": { "engine": { "const": "Qwen3-TTS" }, "model": { "type": "string" }, "voice": { "type": "string" }, "files": { "type": "array", "items": { "type": "object", "properties": { "unit_id": { "type": "string" }, "media": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "audio" } } } ] } }, "required": [ "unit_id", "media" ], "additionalProperties": false } }, "narration": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "audio" } } } ] }, "unit_ranges": { "type": "array", "items": { "type": "object", "properties": { "unit_id": { "type": "string" }, "start_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "end_ms": { "type": [ "integer", "null" ], "minimum": 0 } }, "required": [ "unit_id", "start_ms", "end_ms" ], "additionalProperties": false } } }, "required": [ "engine", "model", "voice", "files", "narration", "unit_ranges" ], "additionalProperties": false } ] } }, "required": [ "request", "result" ], "additionalProperties": false }, "07-cuts": { "type": "object", "properties": { "narration_duration_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "timing_evidence": { "type": "string" }, "cuts": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "start_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "end_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "unit_ids": { "type": "array", "items": { "type": "string" } }, "narration_text": { "type": "string" } }, "required": [ "id", "start_ms", "end_ms", "unit_ids", "narration_text" ], "additionalProperties": false } }, "captions": { "type": "array", "items": { "$ref": "#/$defs/caption" } } }, "required": [ "narration_duration_ms", "timing_evidence", "cuts", "captions" ], "additionalProperties": false }, "08-scenes": { "type": "object", "properties": { "scenes": { "type": "array", "items": { "type": "object", "properties": { "cut_id": { "type": "string" }, "description": { "type": "string" }, "start_state": { "type": "string" }, "end_state": { "type": "string" }, "camera": { "type": "string" } }, "required": [ "cut_id", "description", "start_state", "end_state", "camera" ], "additionalProperties": false } }, "connections": { "type": "array", "items": { "type": "object", "properties": { "from_cut_id": { "type": "string" }, "to_cut_id": { "type": "string" }, "mode": { "enum": [ "continuous", "cut" ] }, "reason": { "type": "string" } }, "required": [ "from_cut_id", "to_cut_id", "mode", "reason" ], "additionalProperties": false } } }, "required": [ "scenes", "connections" ], "additionalProperties": false }, "09-entities": { "type": "object", "properties": { "characters": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "description": { "type": "string" }, "fixed_features": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "description", "fixed_features" ], "additionalProperties": false } }, "backgrounds": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "description": { "type": "string" }, "fixed_features": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "description", "fixed_features" ], "additionalProperties": false } }, "appearances": { "type": "array", "items": { "type": "object", "properties": { "cut_id": { "type": "string" }, "character_ids": { "type": "array", "items": { "type": "string" } }, "background_ids": { "type": "array", "items": { "type": "string" } } }, "required": [ "cut_id", "character_ids", "background_ids" ], "additionalProperties": false } } }, "required": [ "characters", "backgrounds", "appearances" ], "additionalProperties": false }, "10-references": { "type": "object", "properties": { "request": { "type": "object", "properties": { "model": { "const": "gpt-image-2.5-sunburst" }, "style_reference": { "const": "references/1.png" }, "items": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "kind": { "enum": [ "style", "character", "background" ] }, "entity_id": { "anyOf": [ { "type": "null" }, { "type": "string" } ] }, "prompt": { "type": "string" } }, "required": [ "id", "kind", "entity_id", "prompt" ], "additionalProperties": false, "allOf": [ { "if": { "properties": { "kind": { "const": "style" } } }, "then": { "properties": { "entity_id": { "type": "null" } } }, "else": { "properties": { "entity_id": { "type": "string" } } } } ] } } }, "required": [ "model", "style_reference", "items" ], "additionalProperties": false }, "result": { "anyOf": [ { "type": "null" }, { "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "reference_id": { "type": "string" }, "media": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "image" } } } ] } }, "required": [ "reference_id", "media" ], "additionalProperties": false } } }, "required": [ "items" ], "additionalProperties": false } ] } }, "required": [ "request", "result" ], "additionalProperties": false }, "11-images": { "type": "object", "properties": { "request": { "type": "object", "properties": { "model": { "const": "gpt-image-2.5-sunburst" }, "frames": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "cut_id": { "type": "string" }, "position": { "enum": [ "start", "end" ] }, "prompt": { "type": "string" }, "reference_ids": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "cut_id", "position", "prompt", "reference_ids" ], "additionalProperties": false } } }, "required": [ "model", "frames" ], "additionalProperties": false }, "result": { "anyOf": [ { "type": "null" }, { "type": "object", "properties": { "frames": { "type": "array", "items": { "type": "object", "properties": { "frame_id": { "type": "string" }, "media": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "image" } } } ] } }, "required": [ "frame_id", "media" ], "additionalProperties": false } } }, "required": [ "frames" ], "additionalProperties": false } ] } }, "required": [ "request", "result" ], "additionalProperties": false }, "12-motion": { "type": "object", "properties": { "request": { "type": "object", "properties": { "clips": { "type": "array", "items": { "type": "object", "properties": { "cut_id": { "type": "string" }, "start_frame_id": { "type": "string" }, "end_frame_id": { "type": "string" }, "duration_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "motion_prompt": { "type": "string" } }, "required": [ "cut_id", "start_frame_id", "end_frame_id", "duration_ms", "motion_prompt" ], "additionalProperties": false } } }, "required": [ "clips" ], "additionalProperties": false }, "result": { "anyOf": [ { "type": "null" }, { "type": "object", "properties": { "clips": { "type": "array", "items": { "type": "object", "properties": { "cut_id": { "type": "string" }, "media": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "video" } } } ] } }, "required": [ "cut_id", "media" ], "additionalProperties": false } } }, "required": [ "clips" ], "additionalProperties": false } ] } }, "required": [ "request", "result" ], "additionalProperties": false }, "13-compose": { "type": "object", "properties": { "request": { "type": "object", "properties": { "timeline": { "type": "array", "items": { "type": "object", "properties": { "cut_id": { "type": "string" }, "video_path": { "type": "string" }, "start_ms": { "type": [ "integer", "null" ], "minimum": 0 }, "end_ms": { "type": [ "integer", "null" ], "minimum": 0 } }, "required": [ "cut_id", "video_path", "start_ms", "end_ms" ], "additionalProperties": false } }, "narration_path": { "type": "string" }, "captions": { "type": "array", "items": { "$ref": "#/$defs/caption" } }, "title": { "type": "string" } }, "required": [ "timeline", "narration_path", "captions", "title" ], "additionalProperties": false }, "result": { "anyOf": [ { "type": "null" }, { "type": "object", "properties": { "video": { "allOf": [ { "$ref": "#/$defs/media" }, { "properties": { "kind": { "const": "video" } } } ] }, "captions_path": { "type": "string" } }, "required": [ "video", "captions_path" ], "additionalProperties": false } ] } }, "required": [ "request", "result" ], "additionalProperties": false }, "14-review": { "type": "object", "properties": { "checks": { "type": "array", "items": { "type": "object", "properties": { "area": { "enum": [ "story", "visual", "audio", "captions", "timing", "consistency" ] }, "verdict": { "enum": [ "pass", "fail", "not_checked" ] }, "evidence": { "type": "string" } }, "required": [ "area", "verdict", "evidence" ], "additionalProperties": false } }, "findings": { "type": "array", "items": { "type": "object", "properties": { "severity": { "enum": [ "blocking", "minor" ] }, "description": { "type": "string" }, "stage_id": { "enum": [ "01-topic", "02-research", "03-script", "04-title", "05-tts-split", "06-tts", "07-cuts", "08-scenes", "09-entities", "10-references", "11-images", "12-motion", "13-compose", "14-review" ] }, "cut_id": { "anyOf": [ { "type": "null" }, { "type": "string" } ] } }, "required": [ "severity", "description", "stage_id", "cut_id" ], "additionalProperties": false } }, "recommendation": { "enum": [ "pass", "revise", "incomplete" ] } }, "required": [ "checks", "findings", "recommendation" ], "additionalProperties": false, "allOf": [ { "if": { "properties": { "recommendation": { "const": "pass" } } }, "then": { "properties": { "checks": { "type": "array", "items": { "type": "object", "properties": { "area": { "enum": [ "story", "visual", "audio", "captions", "timing", "consistency" ] }, "verdict": { "const": "pass" }, "evidence": { "type": "string", "minLength": 1 } }, "required": [ "area", "verdict", "evidence" ], "additionalProperties": false }, "minItems": 6, "maxItems": 6, "allOf": [ { "contains": { "properties": { "area": { "const": "story" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 }, { "contains": { "properties": { "area": { "const": "visual" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 }, { "contains": { "properties": { "area": { "const": "audio" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 }, { "contains": { "properties": { "area": { "const": "captions" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 }, { "contains": { "properties": { "area": { "const": "timing" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 }, { "contains": { "properties": { "area": { "const": "consistency" } }, "required": [ "area" ] }, "minContains": 1, "maxContains": 1 } ] }, "findings": { "not": { "contains": { "properties": { "severity": { "const": "blocking" } }, "required": [ "severity" ] } } } } } } ] } }, "oneOf": [ { "properties": { "stage_id": { "const": "01-topic" }, "payload": { "$ref": "#/$defs/01-topic" } } }, { "properties": { "stage_id": { "const": "02-research" }, "payload": { "$ref": "#/$defs/02-research" } } }, { "properties": { "stage_id": { "const": "03-script" }, "payload": { "$ref": "#/$defs/03-script" } } }, { "properties": { "stage_id": { "const": "04-title" }, "payload": { "$ref": "#/$defs/04-title" } } }, { "properties": { "stage_id": { "const": "05-tts-split" }, "payload": { "$ref": "#/$defs/05-tts-split" } } }, { "properties": { "stage_id": { "const": "06-tts" }, "payload": { "$ref": "#/$defs/06-tts" } } }, { "properties": { "stage_id": { "const": "07-cuts" }, "payload": { "$ref": "#/$defs/07-cuts" } } }, { "properties": { "stage_id": { "const": "08-scenes" }, "payload": { "$ref": "#/$defs/08-scenes" } } }, { "properties": { "stage_id": { "const": "09-entities" }, "payload": { "$ref": "#/$defs/09-entities" } } }, { "properties": { "stage_id": { "const": "10-references" }, "payload": { "$ref": "#/$defs/10-references" } } }, { "properties": { "stage_id": { "const": "11-images" }, "payload": { "$ref": "#/$defs/11-images" } } }, { "properties": { "stage_id": { "const": "12-motion" }, "payload": { "$ref": "#/$defs/12-motion" } } }, { "properties": { "stage_id": { "const": "13-compose" }, "payload": { "$ref": "#/$defs/13-compose" } } }, { "properties": { "stage_id": { "const": "14-review" }, "payload": { "$ref": "#/$defs/14-review" } } } ] }