{
  "schemaVersion": 1,
  "avatarId": "mika_live2d",
  "runtime": "live2d",
  "compatibilityReferenceAvatarId": "mao_pro",
  "driver": "live2d-core-parameters",
  "requiredContractFile": "PARAMETER_DRIVER_CONTRACT.json",
  "requiredContractUrl": "/mika-avatar/handoff/mika-live2d/parameter-driver-contract.json",
  "requiredContractSchemaUrl": "/mika-avatar/handoff/mika-live2d/parameter-driver-contract.schema.json",
  "requiredParameterMapFile": "PARAMETER_MAP.json",
  "requiredParameterMapUrl": "/mika-avatar/handoff/mika-live2d/parameter-map.json",
  "requiredParameterMapSchemaUrl": "/mika-avatar/handoff/mika-live2d/parameter-map.schema.json",
  "forbiddenDriverModes": [
    "dom-mouth-overlay",
    "css-mouth-overlay",
    "css-motion-animation"
  ],
  "evidenceRule": "Every listed parameter must be present in runtime expression Parameters[].Id or runtime motion Curves[].Id before PARAMETER_MAP.json confirmedInRuntimeModel can be true.",
  "poseRetargetContract": {
    "inputFile": "pose_record.json",
    "inputSchemaFile": "docs/schemas/mika-live2d-pose-record.schema.json",
    "inputSchemaUrl": "/mika-avatar/handoff/mika-live2d/pose-record.schema.json",
    "sampleFile": "pose_record.sample.json",
    "retargetTool": "tools/live2d/pose_record_to_live2d_motion.py",
    "outputRuntimeFile": "runtime/motions/soft-dance-loop.motion3.json",
    "outputFormat": "Cubism motion3.json parameter curves",
    "dryRunReportUrl": "/mika-avatar/handoff/mika-live2d/pose-retarget-dry-run.json",
    "dryRunReportMarkdownUrl": "/mika-avatar/handoff/mika-live2d/pose-retarget-dry-run.md",
    "sampleMotionUrl": "/mika-avatar/handoff/mika-live2d/soft-dance-loop.sample.motion3.json",
    "sampleMotionNote": "Dry-run retarget artifact for production review; not a release-ready runtime motion until the rigged Mika model exists.",
    "sourceVideoFile": "source.mp4",
    "sourceWorkflow": "source.mp4 -> human skeleton timeline -> pose_record.json -> model-native Live2D parameters",
    "referenceUi": "Live2D Dancer style side-by-side source video, skeleton timeline, and full-body Live2D preview",
    "pointFormat": "[x, y, confidence] normalized to source video frame",
    "minimumFps": 30,
    "requiresSynchronizedTimeline": true,
    "requiresFullBodyModel": true,
    "forbiddenFallback": "static PNG standee, CSS-only animation, or detached mouth/limb overlay",
    "requiredSkeletonJoints": [
      "head",
      "neck",
      "shoulder_L",
      "shoulder_R",
      "elbow_L",
      "elbow_R",
      "wrist_L",
      "wrist_R",
      "hip_L",
      "hip_R",
      "knee_L",
      "knee_R",
      "ankle_L",
      "ankle_R"
    ],
    "requiredDrivenParameters": [
      "ParamAngleX",
      "ParamAngleY",
      "ParamAngleZ",
      "ParamBodyAngleX",
      "ParamBodyAngleY",
      "ParamBodyAngleZ",
      "ParamAllX",
      "ParamAllY",
      "ParamAllRotate",
      "ParamLeftShoulderUp",
      "ParamRightShoulderUp",
      "ParamArmLA01",
      "ParamArmLA02",
      "ParamArmLA03",
      "ParamArmRA01",
      "ParamArmRA02",
      "ParamArmRA03",
      "ParamHandLA",
      "ParamHandRA",
      "ParamFingerL",
      "ParamFingerR",
      "ParamLegLA01",
      "ParamLegLA02",
      "ParamLegRA01",
      "ParamLegRA02",
      "ParamFootL",
      "ParamFootR"
    ],
    "acceptanceRule": "A recorded dance clip must visibly move head, body, shoulders, arms, and full-body pose in sync with the skeleton timeline without vertical jitter."
  },
  "mouthTargets": [
    {
      "key": "a",
      "mapValue": "a",
      "runtimeFile": "runtime/expressions/a.exp3.json",
      "requiredParameters": [
        "ParamA"
      ],
      "amplitudeParameter": "ParamMouthDown",
      "evidenceLocation": "runtime/expressions/a.exp3.json Parameters[].Id"
    },
    {
      "key": "i",
      "mapValue": "i",
      "runtimeFile": "runtime/expressions/i.exp3.json",
      "requiredParameters": [
        "ParamI"
      ],
      "amplitudeParameter": "ParamMouthDown",
      "evidenceLocation": "runtime/expressions/i.exp3.json Parameters[].Id"
    },
    {
      "key": "u",
      "mapValue": "u",
      "runtimeFile": "runtime/expressions/u.exp3.json",
      "requiredParameters": [
        "ParamU"
      ],
      "amplitudeParameter": "ParamMouthDown",
      "evidenceLocation": "runtime/expressions/u.exp3.json Parameters[].Id"
    },
    {
      "key": "e",
      "mapValue": "e",
      "runtimeFile": "runtime/expressions/e.exp3.json",
      "requiredParameters": [
        "ParamE"
      ],
      "amplitudeParameter": "ParamMouthDown",
      "evidenceLocation": "runtime/expressions/e.exp3.json Parameters[].Id"
    },
    {
      "key": "o",
      "mapValue": "o",
      "runtimeFile": "runtime/expressions/o.exp3.json",
      "requiredParameters": [
        "ParamO"
      ],
      "amplitudeParameter": "ParamMouthDown",
      "evidenceLocation": "runtime/expressions/o.exp3.json Parameters[].Id"
    }
  ],
  "motionTargets": [
    {
      "key": "idle",
      "mapValue": "idle",
      "runtimeGroup": "idle",
      "runtimeFile": "runtime/motions/idle.motion3.json",
      "requiredParameters": [
        "ParamAngleX",
        "ParamAngleY",
        "ParamAngleZ",
        "ParamBreath"
      ],
      "purpose": "base breathing and gentle head motion when music is not driving a special cue"
    },
    {
      "key": "greeting",
      "mapValue": "greeting",
      "runtimeGroup": "greeting",
      "runtimeFile": "runtime/motions/greeting.motion3.json",
      "requiredParameters": [
        "ParamAngleX",
        "ParamBodyAngleX",
        "ParamBodyAngleY",
        "ParamBodyAngleZ"
      ],
      "purpose": "short greeting or tap response without replacing Mika identity"
    },
    {
      "key": "lyric-reading",
      "mapValue": "lyric-reading",
      "runtimeGroup": "lyric-reading",
      "runtimeFile": "runtime/motions/lyric-reading.motion3.json",
      "requiredParameters": [
        "ParamAllX",
        "ParamAllY",
        "ParamAllRotate",
        "ParamAngleX",
        "ParamAngleY"
      ],
      "purpose": "reading a selected lyric line while mouth parameters handle phonemes"
    },
    {
      "key": "point-lyrics",
      "mapValue": "point-lyrics",
      "runtimeGroup": "point-lyrics",
      "runtimeFile": "runtime/motions/point-lyrics.motion3.json",
      "requiredParameters": [
        "ParamLeftShoulderUp",
        "ParamRightShoulderUp",
        "ParamArmLA01",
        "ParamArmRA01"
      ],
      "purpose": "gesture toward the current lyric area"
    },
    {
      "key": "rhythm-sway",
      "mapValue": "rhythm-sway",
      "runtimeGroup": "rhythm-sway",
      "runtimeFile": "runtime/motions/rhythm-sway.motion3.json",
      "requiredParameters": [
        "ParamBodyAngleX",
        "ParamBodyAngleZ",
        "ParamArmLA01",
        "ParamArmLA02",
        "ParamArmLA03",
        "ParamHandLA",
        "ParamHandRA",
        "ParamLegLA01",
        "ParamLegRA01",
        "ParamFootL",
        "ParamFootR",
        "ParamSkirtFront",
        "ParamSkirtFuwa",
        "ParamSleeveL",
        "ParamSleeveR"
      ],
      "purpose": "song beat sway for tracks without bespoke choreography"
    },
    {
      "key": "chorus-gesture",
      "mapValue": "chorus-gesture",
      "runtimeGroup": "chorus-gesture",
      "runtimeFile": "runtime/motions/chorus-gesture.motion3.json",
      "requiredParameters": [
        "ParamBodyAngleY",
        "ParamRightShoulderUp",
        "ParamArmRA01",
        "ParamArmRA02",
        "ParamArmRA03",
        "ParamHandRA",
        "ParamFingerR"
      ],
      "purpose": "larger chorus hand and upper-body accent"
    },
    {
      "key": "soft-dance-loop",
      "mapValue": "soft-dance-loop",
      "runtimeGroup": "soft-dance-loop",
      "runtimeFile": "runtime/motions/soft-dance-loop.motion3.json",
      "requiredParameters": [
        "ParamAngleX",
        "ParamAngleY",
        "ParamAngleZ",
        "ParamBodyAngleX",
        "ParamBodyAngleY",
        "ParamBodyAngleZ",
        "ParamAllY",
        "ParamAllRotate",
        "ParamBreath",
        "ParamLeftShoulderUp",
        "ParamRightShoulderUp",
        "ParamArmLA01",
        "ParamArmLA02",
        "ParamArmLA03",
        "ParamArmRA01",
        "ParamArmRA02",
        "ParamArmRA03",
        "ParamHandLA",
        "ParamHandRA",
        "ParamFingerL",
        "ParamFingerR",
        "ParamLegLA01",
        "ParamLegLA02",
        "ParamLegRA01",
        "ParamLegRA02",
        "ParamFootL",
        "ParamFootR",
        "ParamHairFront",
        "ParamHairSideL",
        "ParamHairSideR",
        "ParamHairBack",
        "ParamHairBackL",
        "ParamHairBackR",
        "ParamoHairMesh",
        "ParamHairFrontFuwa",
        "ParamHairSideFuwa",
        "ParamHairBackFuwa",
        "ParamEyeLSmile",
        "ParamEyeRSmile",
        "ParamEyeLOpen",
        "ParamEyeROpen",
        "ParamEyeBallX",
        "ParamEyeBallY",
        "ParamCheek",
        "ParamBrowLY",
        "ParamBrowRY",
        "ParamSkirtFront",
        "ParamSkirtSideL",
        "ParamSkirtSideR",
        "ParamSkirtFuwa",
        "ParamSleeveL",
        "ParamSleeveR"
      ],
      "purpose": "smooth loop for Mika-only choreographed songs"
    }
  ]
}
