{
  "package": "ALE reference-animation package for RobotExpressive (revision copy)",
  "generated_by": "Blender Python scripts in private/scripts/, executed headless. Authored with AI assistance.",
  "blender": {
    "version": "5.2.1 LTS",
    "version_tuple": [
      5,
      2,
      1
    ],
    "render_engine": "BLENDER_EEVEE"
  },
  "ffmpeg": "used for H.264 encoding of the rendered PNG frames",
  "source_asset": {
    "name": "RobotExpressive",
    "file": "RobotExpressive.glb",
    "sha256": "047f5e5fb3bb6d378bd1df16ca6137f2a596c99b3a1b5690b4020c05aaf6f319",
    "bytes": 463988,
    "preserved_unchanged": true
  },
  "action": {
    "name": "ALE_RobotExpressive_StepWave_v1",
    "frame_range": [
      1,
      192
    ],
    "fcurve_count": 81,
    "interpolation": "Bezier with auto-clamped handles on every key; pose targets were sampled with monotone cubic (Fritsch-Carlson) interpolation, which cannot overshoot.",
    "keyed_every_frame": true,
    "imported_actions_removed": 14,
    "note": "This is a newly authored action. All 14 actions that shipped in the GLB, their NLA tracks and the facial shape-key animation were deleted, not merely muted."
  },
  "timeline": {
    "fps": 24,
    "frame_start": 1,
    "frame_end": 192,
    "frame_count": 192,
    "duration_s": 8.0,
    "motion_events": [
      {
        "name": "relaxed_stand_anticipation_weight_shift",
        "frames": [
          1,
          24
        ],
        "description": "Relaxed standing pose, small anticipatory dip and weight shift onto the right foot."
      },
      {
        "name": "step_to_anatomical_left",
        "frames": [
          25,
          60
        ],
        "description": "One clear step toward the character's anatomical left (+X): left foot swings and plants, right foot closes, with coordinated hip, knee and ankle motion."
      },
      {
        "name": "settle_and_raise_right_arm",
        "frames": [
          61,
          84
        ],
        "description": "Weight settles over the new stance while the right arm raises out to the side to head height."
      },
      {
        "name": "wave_twice",
        "frames": [
          85,
          132
        ],
        "description": "Two distinct waves. Wave 1 spans frames 91-103 (in-out-in), a hold spans 103-120, wave 2 spans 120-126 (in-out), settling by 132. Subtle head and torso response."
      },
      {
        "name": "lower_arm",
        "frames": [
          133,
          156
        ],
        "description": "Right arm lowers on an outward arc back to the side."
      },
      {
        "name": "step_back_and_settle",
        "frames": [
          157,
          192
        ],
        "description": "Right foot steps back to its start, left foot closes, body settles into the frame-1 stance."
      }
    ],
    "sub_events": {
      "left_foot_airborne": [
        30,
        47
      ],
      "left_foot_contact": 48,
      "right_foot_airborne_closing": [
        52,
        63
      ],
      "right_foot_contact": 64,
      "right_arm_raise": [
        62,
        84
      ],
      "wave_1": [
        91,
        103
      ],
      "wave_hold": [
        103,
        120
      ],
      "wave_2": [
        120,
        126
      ],
      "right_arm_lower": [
        132,
        159
      ],
      "right_foot_airborne_return": [
        162,
        177
      ],
      "right_foot_return_contact": 178,
      "left_foot_airborne_return": [
        179,
        191
      ],
      "left_foot_return_contact": 192
    }
  },
  "units": {
    "system": "METRIC",
    "scale_length": 1.0,
    "length_unit": "METERS",
    "note": "1 Blender unit = 1 m nominally, but this cartoon robot is authored at roughly 3.93 units tall; treat units as relative."
  },
  "coordinate_conventions": {
    "up_axis": "+Z",
    "character_forward": "-Y",
    "character_anatomical_left": "+X",
    "floor_plane": "z = 0",
    "handedness": "right-handed"
  },
  "character": {
    "height_units": 4.2611,
    "animated_bbox_min": [
      -2.0791,
      -1.9559,
      -0.0
    ],
    "animated_bbox_max": [
      2.8503,
      1.5979,
      4.2611
    ],
    "neutral_t_pose_height_units": 3.9348,
    "neutral_t_pose_arm_span_units": 6.61855
  },
  "camera": {
    "name": "RefCamera",
    "type": "PERSP",
    "animated": false,
    "location": [
      -4.066171,
      -7.889643,
      3.861233
    ],
    "rotation_euler_xyz_rad": [
      1.37881,
      -0.0,
      -0.523599
    ],
    "rotation_euler_xyz_deg": [
      79.0,
      -0.0,
      -30.0
    ],
    "look_at_target": [
      0.3856,
      -0.179,
      2.1306
    ],
    "distance_to_target": 9.0702,
    "lens_mm": 50.0,
    "sensor_width_mm": 36.0,
    "sensor_fit": "AUTO",
    "horizontal_fov_deg": 39.5978,
    "clip_start": 0.10000000149011612,
    "clip_end": 200.0,
    "azimuth_off_front_deg": 30.0,
    "elevation_deg": 11.0,
    "framing_margin": 0.08,
    "worst_frame_fill": 0.92
  },
  "lighting": [
    {
      "name": "KeyLight",
      "type": "AREA",
      "shape": "SQUARE",
      "size": 9.0,
      "energy_w": 4200.0,
      "color": [
        1.0,
        0.98,
        0.95
      ],
      "location": [
        -6.5,
        -9.0,
        9.5
      ]
    },
    {
      "name": "FillLight",
      "type": "AREA",
      "shape": "SQUARE",
      "size": 11.0,
      "energy_w": 1500.0,
      "color": [
        0.93,
        0.96,
        1.0
      ],
      "location": [
        8.0,
        -7.0,
        3.6
      ]
    },
    {
      "name": "RimLight",
      "type": "AREA",
      "shape": "SQUARE",
      "size": 8.0,
      "energy_w": 2200.0,
      "color": [
        0.97,
        0.98,
        1.0
      ],
      "location": [
        1.5,
        9.0,
        7.5
      ]
    },
    {
      "name": "FloorBounce",
      "type": "AREA",
      "shape": "SQUARE",
      "size": 7.0,
      "energy_w": 260.0,
      "color": [
        1.0,
        0.97,
        0.93
      ],
      "location": [
        0.4,
        -2.5,
        0.35
      ]
    }
  ],
  "floor": {
    "object": "RefFloor",
    "size": 80.0,
    "z": 0.0,
    "material": "RefFloorMat",
    "base_color": [
      0.2,
      0.205,
      0.215
    ],
    "roughness": 0.55
  },
  "world_background_rgb": [
    0.055,
    0.06,
    0.07
  ],
  "render": {
    "engine": "BLENDER_EEVEE",
    "resolution": [
      960,
      960
    ],
    "resolution_percentage": 100,
    "fps": 24,
    "frame_start": 1,
    "frame_end": 192,
    "frame_count": 192,
    "duration_s": 8.0,
    "file_format": "PNG",
    "color_mode": "RGB",
    "color_depth": "8",
    "view_transform": "Standard",
    "look": "None",
    "film_transparent": false,
    "eevee_taa_render_samples": 64
  },
  "rig": {
    "armature_object": "RobotArmature",
    "armature_world_matrix": [
      [
        100.0,
        0.0,
        0.0,
        0.0
      ],
      [
        0.0,
        -1.3e-05,
        99.999992,
        0.0
      ],
      [
        0.0,
        -99.999992,
        -1.3e-05,
        2.370059
      ],
      [
        0.0,
        0.0,
        0.0,
        1.0
      ]
    ],
    "armature_note": "The glTF importer left the armature object with a scale of 100 and a -90deg X rotation. Bone local coordinates are therefore NOT world coordinates; multiply by armature_world_matrix.",
    "bone_count": 43,
    "root_bones": [
      "Bone"
    ],
    "bone_names_original": [
      "Bone",
      "Foot.L",
      "Body",
      "Hips",
      "Abdomen",
      "Torso",
      "Neck",
      "Head",
      "Shoulder.L",
      "UpperArm.L",
      "LowerArm.L",
      "Palm2.L",
      "Middle1.L",
      "Middle2.L",
      "Thumb.L",
      "Thumb2.L",
      "Palm1.L",
      "Index.L",
      "Index2.L",
      "Palm3.L",
      "Ring1.L",
      "Ring2.L",
      "Shoulder.R",
      "UpperArm.R",
      "LowerArm.R",
      "Palm2.R",
      "Middle1.R",
      "Middle2.R",
      "Thumb.R",
      "Thumb2.R",
      "Palm1.R",
      "Index.R",
      "Index2.R",
      "Palm3.R",
      "Ring1.R",
      "Ring2.R",
      "UpperLeg.L",
      "LowerLeg.L",
      "UpperLeg.R",
      "LowerLeg.R",
      "PoleTarget.L",
      "Foot.R",
      "PoleTarget.R"
    ],
    "bones_renamed": false,
    "semantic_bone_map": {
      "root": "Bone",
      "pelvis": "Body",
      "hips": "Hips",
      "spine_lower": "Abdomen",
      "spine_upper": "Torso",
      "neck": "Neck",
      "head": "Head",
      "shoulder_l": "Shoulder.L",
      "shoulder_r": "Shoulder.R",
      "upper_arm_l": "UpperArm.L",
      "upper_arm_r": "UpperArm.R",
      "forearm_l": "LowerArm.L",
      "forearm_r": "LowerArm.R",
      "upper_leg_l": "UpperLeg.L",
      "upper_leg_r": "UpperLeg.R",
      "lower_leg_l": "LowerLeg.L",
      "lower_leg_r": "LowerLeg.R",
      "foot_l": "Foot.L",
      "foot_r": "Foot.R"
    },
    "rig_helper_bones": [
      "PoleTarget.L",
      "PoleTarget.R"
    ],
    "hand_detail_bones": [
      "Palm1.L",
      "Palm2.L",
      "Palm3.L",
      "Index.L",
      "Index2.L",
      "Middle1.L",
      "Middle2.L",
      "Ring1.L",
      "Ring2.L",
      "Thumb.L",
      "Thumb2.L",
      "Palm1.R",
      "Palm2.R",
      "Palm3.R",
      "Index.R",
      "Index2.R",
      "Middle1.R",
      "Middle2.R",
      "Ring1.R",
      "Ring2.R",
      "Thumb.R",
      "Thumb2.R"
    ],
    "bone_lengths_degenerate": {
      "all_bones_length_armature_units": 0.0001,
      "consequence": "Blender's IK solver is unusable on this rig. Legs and arms were solved analytically in Python and baked as FK rotations, so the saved scene needs no constraints, drivers, scripts or add-ons to evaluate."
    },
    "bone_hierarchy": {
      "Bone": null,
      "Foot.L": "Bone",
      "Body": "Bone",
      "Hips": "Body",
      "Abdomen": "Hips",
      "Torso": "Abdomen",
      "Neck": "Torso",
      "Head": "Neck",
      "Shoulder.L": "Torso",
      "UpperArm.L": "Shoulder.L",
      "LowerArm.L": "UpperArm.L",
      "Palm2.L": "LowerArm.L",
      "Middle1.L": "Palm2.L",
      "Middle2.L": "Middle1.L",
      "Thumb.L": "LowerArm.L",
      "Thumb2.L": "Thumb.L",
      "Palm1.L": "LowerArm.L",
      "Index.L": "Palm1.L",
      "Index2.L": "Index.L",
      "Palm3.L": "LowerArm.L",
      "Ring1.L": "Palm3.L",
      "Ring2.L": "Ring1.L",
      "Shoulder.R": "Torso",
      "UpperArm.R": "Shoulder.R",
      "LowerArm.R": "UpperArm.R",
      "Palm2.R": "LowerArm.R",
      "Middle1.R": "Palm2.R",
      "Middle2.R": "Middle1.R",
      "Thumb.R": "LowerArm.R",
      "Thumb2.R": "Thumb.R",
      "Palm1.R": "LowerArm.R",
      "Index.R": "Palm1.R",
      "Index2.R": "Index.R",
      "Palm3.R": "LowerArm.R",
      "Ring1.R": "Palm3.R",
      "Ring2.R": "Ring1.R",
      "UpperLeg.L": "Body",
      "LowerLeg.L": "UpperLeg.L",
      "UpperLeg.R": "Body",
      "LowerLeg.R": "UpperLeg.R",
      "PoleTarget.L": "Bone",
      "Foot.R": "Bone",
      "PoleTarget.R": "Bone"
    },
    "rest_pose_world_bone_heads": {
      "Bone": [
        -0.00048,
        0.174054,
        -0.006123
      ],
      "Foot.L": [
        0.636242,
        0.117039,
        0.024456
      ],
      "Body": [
        0.004766,
        -0.133666,
        1.440332
      ],
      "Hips": [
        0.002716,
        -0.020994,
        1.343757
      ],
      "Abdomen": [
        0.002716,
        0.056673,
        1.663244
      ],
      "Torso": [
        0.002716,
        0.060372,
        2.147814
      ],
      "Neck": [
        0.002716,
        -0.003158,
        2.728437
      ],
      "Head": [
        0.002716,
        -0.010293,
        3.03822
      ],
      "Shoulder.L": [
        0.585453,
        -0.004151,
        2.439245
      ],
      "UpperArm.L": [
        0.669461,
        -0.004151,
        2.437041
      ],
      "LowerArm.L": [
        1.325657,
        -0.041693,
        2.43163
      ],
      "Palm2.L": [
        2.692721,
        0.011463,
        2.448372
      ],
      "Middle1.L": [
        2.99392,
        -0.205487,
        2.448372
      ],
      "Middle2.L": [
        3.142323,
        -0.323116,
        2.448372
      ],
      "Thumb.L": [
        2.583031,
        -0.076879,
        2.636852
      ],
      "Thumb2.L": [
        2.576556,
        -0.136253,
        2.759784
      ],
      "Palm1.L": [
        2.692722,
        0.011463,
        2.448371
      ],
      "Index.L": [
        3.006165,
        -0.205487,
        2.63039
      ],
      "Index2.L": [
        3.15443,
        -0.323115,
        2.636761
      ],
      "Palm3.L": [
        2.692722,
        0.011463,
        2.448371
      ],
      "Ring1.L": [
        3.006165,
        -0.205486,
        2.257746
      ],
      "Ring2.L": [
        3.15443,
        -0.323116,
        2.264116
      ],
      "Shoulder.R": [
        -0.6341,
        -0.004151,
        2.439272
      ],
      "UpperArm.R": [
        -0.736273,
        -0.004151,
        2.438264
      ],
      "LowerArm.R": [
        -1.310246,
        -0.041693,
        2.43163
      ],
      "Palm2.R": [
        -2.688838,
        0.011463,
        2.448372
      ],
      "Middle1.R": [
        -2.990036,
        -0.205486,
        2.448371
      ],
      "Middle2.R": [
        -3.138439,
        -0.323116,
        2.448371
      ],
      "Thumb.R": [
        -2.579148,
        -0.076879,
        2.636852
      ],
      "Thumb2.R": [
        -2.572672,
        -0.136253,
        2.759784
      ],
      "Palm1.R": [
        -2.688838,
        0.011463,
        2.448372
      ],
      "Index.R": [
        -3.00228,
        -0.205486,
        2.63039
      ],
      "Index2.R": [
        -3.150545,
        -0.323115,
        2.63676
      ],
      "Palm3.R": [
        -2.688838,
        0.011463,
        2.448372
      ],
      "Ring1.R": [
        -3.002281,
        -0.205487,
        2.257746
      ],
      "Ring2.R": [
        -3.150546,
        -0.323116,
        2.264116
      ],
      "UpperLeg.L": [
        0.633012,
        0.048895,
        1.536557
      ],
      "LowerLeg.L": [
        0.633012,
        -0.059059,
        0.935163
      ],
      "UpperLeg.R": [
        -0.64059,
        0.048895,
        1.536557
      ],
      "LowerLeg.R": [
        -0.64059,
        -0.059059,
        0.935163
      ],
      "PoleTarget.L": [
        0.627885,
        -1.535433,
        1.05196
      ],
      "Foot.R": [
        -0.63736,
        0.117039,
        0.024456
      ],
      "PoleTarget.R": [
        -0.645718,
        -1.535433,
        1.05196
      ]
    },
    "part_bindings": {
      "Arm.L": {
        "type": "rigid_bone_parent",
        "bone": "UpperArm.L"
      },
      "Arm.R": {
        "type": "rigid_bone_parent",
        "bone": "UpperArm.R"
      },
      "Foot.L": {
        "type": "rigid_bone_parent",
        "bone": "Foot.L"
      },
      "Foot.R": {
        "type": "rigid_bone_parent",
        "bone": "Foot.R"
      },
      "Hand.L": {
        "type": "skinned_armature_modifier",
        "vertex_groups": 43
      },
      "Hand.R": {
        "type": "skinned_armature_modifier",
        "vertex_groups": 43
      },
      "Head": {
        "type": "rigid_bone_parent",
        "bone": "Head"
      },
      "Leg.L": {
        "type": "rigid_bone_parent",
        "bone": "UpperLeg.L"
      },
      "Leg.R": {
        "type": "rigid_bone_parent",
        "bone": "UpperLeg.R"
      },
      "LowerLeg.L": {
        "type": "rigid_bone_parent",
        "bone": "LowerLeg.L"
      },
      "LowerLeg.R": {
        "type": "rigid_bone_parent",
        "bone": "LowerLeg.R"
      },
      "Shoulder.L": {
        "type": "rigid_bone_parent",
        "bone": "Shoulder.L"
      },
      "Shoulder.R": {
        "type": "rigid_bone_parent",
        "bone": "Shoulder.R"
      },
      "Torso": {
        "type": "rigid_bone_parent",
        "bone": "Body"
      }
    },
    "deformation_summary": "12 rigid parts driven by single-bone parenting + 2 skin-weighted hands (14 character parts total). This is the original author setup and was preserved.",
    "facial_shape_keys": {
      "names": [
        "Basis",
        "Angry",
        "Surprised",
        "Sad"
      ],
      "all_values": 0.0,
      "animated": false,
      "note": "Face held neutral; no lip sync."
    }
  },
  "deliverables": {
    "agent_visible": {
      "input/reference.mp4": "reference video, 960x960, 24 fps, 8 s",
      "input/character.obj": "neutral unrigged T-pose mesh, 14 parts",
      "input/character.mtl": "materials, relative path from the OBJ"
    },
    "private": {
      "private/reference.blend": "authoritative animated scene",
      "private/ground_truth_motion.json": "per-frame bone ground truth",
      "private/reference_metadata.json": "this file",
      "private/validation_report.md": "verification results",
      "private/scripts/": "implementation scripts",
      "private/logs/": "execution logs",
      "private/qa/": "QA renders and machine-readable check reports",
      "private/render_frames/": "lossless PNG frames"
    },
    "textures": "none: all three materials are flat colours with no image textures, no UVs and no vertex colours, so input/textures/ is intentionally absent."
  },
  "revision_note": "Corrected deformation_summary: 12 rigid parts + 2 skinned hands (14 parts total). Absolute machine paths removed. This file lives in the revision tree; the submitted package was not modified."
}
