feat(character-animation): add local rigged character pipeline
New beta pipeline for reusable cartoon characters with SVG rigs, pose
libraries, action timelines, and Canvas/Remotion/HyperFrames rendering.
- pipeline_defs/character-animation.yaml: 11-stage manifest
- skills/pipelines/character-animation/: 11 stage director skills
- tools/character/: BaseTool implementations for char design, rigging,
pose libraries, action timelines, previews, and QA
- schemas/artifacts/{character_design,rig_plan,pose_library,
action_timeline,character_qa_report}.schema.json: canonical artifacts
- schemas/artifacts/scene_plan.schema.json: extended for character-led
scenes
- .agents/skills/{canvas-procedural-animation,character-animation-qa,
character-rigging,pose-library-design,svg-character-animation}/:
Layer 3 vendor knowledge
- AGENT_GUIDE / PROJECT_CONTEXT / README / ARCHITECTURE / PROVIDERS:
surface the new pipeline and its capability family
- tools/video/hyperframes_compose.py: SVG character rig support
- tests/contracts/test_character_animation_pipeline.py: contract tests
This commit is contained in:
@@ -15,7 +15,11 @@ ARTIFACT_NAMES = [
|
||||
"proposal_packet",
|
||||
"brief",
|
||||
"script",
|
||||
"character_design",
|
||||
"rig_plan",
|
||||
"pose_library",
|
||||
"scene_plan",
|
||||
"action_timeline",
|
||||
"asset_manifest",
|
||||
"edit_decisions",
|
||||
"render_report",
|
||||
@@ -25,6 +29,7 @@ ARTIFACT_NAMES = [
|
||||
"decision_log",
|
||||
"source_media_review",
|
||||
"final_review",
|
||||
"character_qa_report",
|
||||
"video_analysis_brief",
|
||||
]
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "openmontage/artifacts/action_timeline",
|
||||
"title": "Action Timeline",
|
||||
"description": "Timed character actions and poses compiled for rendering.",
|
||||
"type": "object",
|
||||
"required": ["version", "scenes"],
|
||||
"properties": {
|
||||
"version": { "type": "string", "const": "1.0" },
|
||||
"fps": { "type": "number", "minimum": 1, "default": 30 },
|
||||
"scenes": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["scene_id", "start_seconds", "end_seconds", "actions"],
|
||||
"properties": {
|
||||
"scene_id": { "type": "string" },
|
||||
"start_seconds": { "type": "number", "minimum": 0 },
|
||||
"end_seconds": { "type": "number", "minimum": 0 },
|
||||
"camera": { "type": "object" },
|
||||
"background": { "type": "string" },
|
||||
"effects": { "type": "array", "items": { "type": "string" } },
|
||||
"actions": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["at_seconds", "character_id", "action"],
|
||||
"properties": {
|
||||
"at_seconds": { "type": "number", "minimum": 0 },
|
||||
"duration_seconds": { "type": "number", "minimum": 0 },
|
||||
"character_id": { "type": "string" },
|
||||
"action": { "type": "string" },
|
||||
"pose": { "type": "string" },
|
||||
"emotion": { "type": "string" },
|
||||
"target": { "type": "string" },
|
||||
"easing": { "type": "string" },
|
||||
"notes": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"metadata": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "openmontage/artifacts/character_design",
|
||||
"title": "Character Design",
|
||||
"description": "Character definitions for local rigged animation.",
|
||||
"type": "object",
|
||||
"required": ["version", "characters"],
|
||||
"properties": {
|
||||
"version": { "type": "string", "const": "1.0" },
|
||||
"style": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"visual_style": { "type": "string" },
|
||||
"palette": { "type": "array", "items": { "type": "string" } },
|
||||
"line_style": { "type": "string" },
|
||||
"texture": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"characters": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["id", "role", "body_type", "style", "required_emotions", "required_actions"],
|
||||
"properties": {
|
||||
"id": { "type": "string" },
|
||||
"display_name": { "type": "string" },
|
||||
"role": { "type": "string" },
|
||||
"body_type": { "type": "string" },
|
||||
"style": { "type": "string" },
|
||||
"silhouette_notes": { "type": "string" },
|
||||
"required_emotions": { "type": "array", "items": { "type": "string" } },
|
||||
"required_actions": { "type": "array", "items": { "type": "string" } },
|
||||
"required_views": { "type": "array", "items": { "type": "string" } },
|
||||
"props": { "type": "array", "items": { "type": "string" } },
|
||||
"constraints": { "type": "array", "items": { "type": "string" } }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"metadata": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "openmontage/artifacts/character_qa_report",
|
||||
"title": "Character QA Report",
|
||||
"description": "Structured review of character rig integrity, motion, and render readiness.",
|
||||
"type": "object",
|
||||
"required": ["version", "status", "checks"],
|
||||
"properties": {
|
||||
"version": { "type": "string", "const": "1.0" },
|
||||
"status": { "type": "string", "enum": ["pass", "revise", "fail"] },
|
||||
"preview_path": { "type": "string" },
|
||||
"checks": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"schema_valid": { "type": "boolean" },
|
||||
"assets_exist": { "type": "boolean" },
|
||||
"pivots_defined": { "type": "boolean" },
|
||||
"poses_defined": { "type": "boolean" },
|
||||
"actions_timed": { "type": "boolean" },
|
||||
"motion_detected": { "type": "boolean" },
|
||||
"browser_preview_checked": { "type": "boolean" },
|
||||
"frame_samples_checked": { "type": "boolean" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"issues": { "type": "array", "items": { "type": "string" } },
|
||||
"recommended_action": {
|
||||
"type": "string",
|
||||
"enum": ["present_to_user", "fix_rig", "fix_assets", "fix_timeline", "block"]
|
||||
},
|
||||
"metadata": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "openmontage/artifacts/pose_library",
|
||||
"title": "Pose Library",
|
||||
"description": "Named reusable poses, expressions, and transition hints for character rigs.",
|
||||
"type": "object",
|
||||
"required": ["version", "characters"],
|
||||
"properties": {
|
||||
"version": { "type": "string", "const": "1.0" },
|
||||
"characters": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["character_id", "poses"],
|
||||
"properties": {
|
||||
"character_id": { "type": "string" },
|
||||
"poses": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"description": { "type": "string" },
|
||||
"parts": { "type": "object" },
|
||||
"expression": { "type": "string" },
|
||||
"hold_frames": { "type": "integer", "minimum": 0 },
|
||||
"transition": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"mouth_shapes": { "type": "object" },
|
||||
"action_cycles": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"metadata": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "openmontage/artifacts/rig_plan",
|
||||
"title": "Rig Plan",
|
||||
"description": "Rig parts, pivots, layers, constraints, and views for character animation.",
|
||||
"type": "object",
|
||||
"required": ["version", "characters"],
|
||||
"properties": {
|
||||
"version": { "type": "string", "const": "1.0" },
|
||||
"characters": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["character_id", "parts", "joints", "layers", "required_poses"],
|
||||
"properties": {
|
||||
"character_id": { "type": "string" },
|
||||
"rig_type": { "type": "string", "enum": ["svg_rig", "canvas_procedural", "lottie", "hybrid"], "default": "svg_rig" },
|
||||
"parts": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["id", "kind", "layer"],
|
||||
"properties": {
|
||||
"id": { "type": "string" },
|
||||
"kind": { "type": "string" },
|
||||
"layer": { "type": "integer" },
|
||||
"asset_path": { "type": "string" },
|
||||
"parent": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"joints": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"required": ["pivot"],
|
||||
"properties": {
|
||||
"pivot": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 },
|
||||
"rotation": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 },
|
||||
"scale": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"layers": { "type": "array", "items": { "type": "string" } },
|
||||
"views": { "type": "array", "items": { "type": "string" } },
|
||||
"required_poses": { "type": "array", "items": { "type": "string" } },
|
||||
"required_actions": { "type": "array", "items": { "type": "string" } },
|
||||
"risks": { "type": "array", "items": { "type": "string" } }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"metadata": { "type": "object" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -17,7 +17,7 @@
|
||||
"id": { "type": "string" },
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["talking_head", "broll", "animation", "diagram", "text_card", "transition", "generated", "screen_recording"]
|
||||
"enum": ["talking_head", "broll", "animation", "character_scene", "diagram", "text_card", "transition", "generated", "screen_recording"]
|
||||
},
|
||||
"description": { "type": "string" },
|
||||
"start_seconds": { "type": "number", "minimum": 0 },
|
||||
@@ -68,6 +68,27 @@
|
||||
"default": false,
|
||||
"description": "True if this is the visual peak of the video — deserves extra attention"
|
||||
},
|
||||
"character_actions": {
|
||||
"type": "array",
|
||||
"description": "Character-specific acting beats for rigged character animation scenes",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["character_id", "action_sequence"],
|
||||
"properties": {
|
||||
"character_id": { "type": "string" },
|
||||
"emotion": { "type": "string" },
|
||||
"action_sequence": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"minItems": 1
|
||||
},
|
||||
"dialogue": { "type": "string" },
|
||||
"target": { "type": "string" },
|
||||
"notes": { "type": "string" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"texture_keywords": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
|
||||
Reference in New Issue
Block a user