{
  "standard": "IPL — Interpretable Pose Latent",
  "version": "1.1.2",
  "released": "2026-10-15",
  "supersedes": "1.1.1",
  "namespace": "signthai.com/ipl",
  "media_type": "application/vnd.ipl+json",
  "value_convention": "normalized n in [-1, 1]; bipolar real = n * max; unipolar real = (n + 1) / 2 * max; circular stores degrees wrapping at max",
  "count": 71,
  "params": [
    {
      "id": "a_hand_x_l",
      "base": "a_hand_x",
      "group": "a",
      "side": "l",
      "default": 0.3333333333333333,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand sideways position, in units of L_X = 2 · r · calibrated hand length (wrist → middle fingertip)",
        "th": "ตำแหน่งมือซ้าย-ขวา ในหน่วย L_X = 2 · r · ความยาวมือ (ข้อมือถึงปลายนิ้วกลาง) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = across to far side · +1 = out past own shoulder (max 1.5)",
        "th": "−1 = ข้ามไปฝั่งตรงข้าม · +1 = ออกพ้นไหล่ตัวเอง (max 1.5)"
      }
    },
    {
      "id": "a_hand_x_r",
      "base": "a_hand_x",
      "group": "a",
      "side": "r",
      "default": 0.3333333333333333,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand sideways position, in units of L_X = 2 · r · calibrated hand length (wrist → middle fingertip)",
        "th": "ตำแหน่งมือซ้าย-ขวา ในหน่วย L_X = 2 · r · ความยาวมือ (ข้อมือถึงปลายนิ้วกลาง) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = across to far side · +1 = out past own shoulder (max 1.5)",
        "th": "−1 = ข้ามไปฝั่งตรงข้าม · +1 = ออกพ้นไหล่ตัวเอง (max 1.5)"
      }
    },
    {
      "id": "a_hand_y_l",
      "base": "a_hand_y",
      "group": "a",
      "side": "l",
      "default": -0.9333333333333332,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand height, in units of L_Y = 2 · r · calibrated torso length (neck → navel)",
        "th": "ความสูงมือ ในหน่วย L_Y = 2 · r · ความยาวช่วงตัว (คอถึงสะดือ) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = low/by hip · +1 = high overhead (max 1.5)",
        "th": "−1 = ต่ำ/ระดับสะโพก · +1 = สูงเหนือหัว (max 1.5)"
      }
    },
    {
      "id": "a_hand_y_r",
      "base": "a_hand_y",
      "group": "a",
      "side": "r",
      "default": -0.9333333333333332,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand height, in units of L_Y = 2 · r · calibrated torso length (neck → navel)",
        "th": "ความสูงมือ ในหน่วย L_Y = 2 · r · ความยาวช่วงตัว (คอถึงสะดือ) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = low/by hip · +1 = high overhead (max 1.5)",
        "th": "−1 = ต่ำ/ระดับสะโพก · +1 = สูงเหนือหัว (max 1.5)"
      }
    },
    {
      "id": "a_hand_z_l",
      "base": "a_hand_z",
      "group": "a",
      "side": "l",
      "default": 0.35,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand forward reach, in units of L_Z = 2 · r · calibrated arm length (shoulder → wrist, extended)",
        "th": "ระยะยื่นมือไปหน้า ในหน่วย L_Z = 2 · r · ความยาวแขน (ไหล่ถึงข้อมือเมื่อเหยียดเต็มที่) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = tucked to body · +1 = fully forward (max 1.5)",
        "th": "−1 = ชิดตัว · +1 = ยื่นสุด (max 1.5)"
      }
    },
    {
      "id": "a_hand_z_r",
      "base": "a_hand_z",
      "group": "a",
      "side": "r",
      "default": 0.35,
      "max": 1.5,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Hand forward reach, in units of L_Z = 2 · r · calibrated arm length (shoulder → wrist, extended)",
        "th": "ระยะยื่นมือไปหน้า ในหน่วย L_Z = 2 · r · ความยาวแขน (ไหล่ถึงข้อมือเมื่อเหยียดเต็มที่) ที่คาลิเบรตแล้ว"
      },
      "poles": {
        "en": "−1 = tucked to body · +1 = fully forward (max 1.5)",
        "th": "−1 = ชิดตัว · +1 = ยื่นสุด (max 1.5)"
      }
    },
    {
      "id": "a_spread_l",
      "base": "a_spread",
      "group": "a",
      "side": "l",
      "default": 0.4,
      "max": 1,
      "unipolar": true,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Elbow spread",
        "th": "การกางข้อศอก"
      },
      "poles": {
        "en": "0 = tucked to ribs · +1 = elbow out (unipolar, max 1)",
        "th": "0 = หุบชิดซี่โครง · +1 = กางออก (unipolar, max 1)"
      }
    },
    {
      "id": "a_spread_r",
      "base": "a_spread",
      "group": "a",
      "side": "r",
      "default": 0.4,
      "max": 1,
      "unipolar": true,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Elbow spread",
        "th": "การกางข้อศอก"
      },
      "poles": {
        "en": "0 = tucked to ribs · +1 = elbow out (unipolar, max 1)",
        "th": "0 = หุบชิดซี่โครง · +1 = กางออก (unipolar, max 1)"
      }
    },
    {
      "id": "w_qx_l",
      "base": "w_qx",
      "group": "w",
      "side": "l",
      "default": 0.8848,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion x (pitch axis)",
        "th": "ควอเทอร์เนียน x (แกนก้มเงย)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "w_qx_r",
      "base": "w_qx",
      "group": "w",
      "side": "r",
      "default": 0.8848,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion x (pitch axis)",
        "th": "ควอเทอร์เนียน x (แกนก้มเงย)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "w_qy_l",
      "base": "w_qy",
      "group": "w",
      "side": "l",
      "default": -0.0931,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion y (pronate axis)",
        "th": "ควอเทอร์เนียน y (แกนคว่ำหงาย)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "w_qy_r",
      "base": "w_qy",
      "group": "w",
      "side": "r",
      "default": -0.0931,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion y (pronate axis)",
        "th": "ควอเทอร์เนียน y (แกนคว่ำหงาย)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "w_qz_l",
      "base": "w_qz",
      "group": "w",
      "side": "l",
      "default": -0.4289,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion z (roll axis)",
        "th": "ควอเทอร์เนียน z (แกนหมุน)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "w_qz_r",
      "base": "w_qz",
      "group": "w",
      "side": "r",
      "default": -0.4289,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Quaternion z (roll axis)",
        "th": "ควอเทอร์เนียน z (แกนหมุน)"
      },
      "poles": {
        "en": "−1 … +1 (max 1)",
        "th": "−1 … +1 (max 1)"
      }
    },
    {
      "id": "g_thumb_curl_l",
      "base": "g_thumb_curl",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_thumb_curl_r",
      "base": "g_thumb_curl",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_index_curl_l",
      "base": "g_index_curl",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_index_curl_r",
      "base": "g_index_curl",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_middle_curl_l",
      "base": "g_middle_curl",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_middle_curl_r",
      "base": "g_middle_curl",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_ring_curl_l",
      "base": "g_ring_curl",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_ring_curl_r",
      "base": "g_ring_curl",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_pinky_curl_l",
      "base": "g_pinky_curl",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_pinky_curl_r",
      "base": "g_pinky_curl",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger curl (PIP/DIP toward palm)",
        "th": "งอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)"
      },
      "poles": {
        "en": "−1 = bent back (hyperextended) · 0 = straight · +1 = fully curled",
        "th": "−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด"
      }
    },
    {
      "id": "g_index_fold_l",
      "base": "g_index_fold",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_index_fold_r",
      "base": "g_index_fold",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_middle_fold_l",
      "base": "g_middle_fold",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_middle_fold_r",
      "base": "g_middle_fold",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_ring_fold_l",
      "base": "g_ring_fold",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_ring_fold_r",
      "base": "g_ring_fold",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_pinky_fold_l",
      "base": "g_pinky_fold",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_pinky_fold_r",
      "base": "g_pinky_fold",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "MCP base-knuckle fold",
        "th": "พับโคนนิ้ว (MCP)"
      },
      "poles": {
        "en": "−1 = folded backward · 0 = straight · +1 = folded toward palm",
        "th": "−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ"
      }
    },
    {
      "id": "g_thumb_fold_l",
      "base": "g_thumb_fold",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb opposition (sweep across palm to pinky base)",
        "th": "โป้งหุบขวางฝ่ามือ (ไปฐานนิ้วก้อย)"
      },
      "poles": {
        "en": "−1 = away · +1 = across palm",
        "th": "−1 = ออกห่าง · +1 = ขวางฝ่ามือ"
      }
    },
    {
      "id": "g_thumb_fold_r",
      "base": "g_thumb_fold",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb opposition (sweep across palm to pinky base)",
        "th": "โป้งหุบขวางฝ่ามือ (ไปฐานนิ้วก้อย)"
      },
      "poles": {
        "en": "−1 = away · +1 = across palm",
        "th": "−1 = ออกห่าง · +1 = ขวางฝ่ามือ"
      }
    },
    {
      "id": "g_index_side_l",
      "base": "g_index_side",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_index_side_r",
      "base": "g_index_side",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_middle_side_l",
      "base": "g_middle_side",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_middle_side_r",
      "base": "g_middle_side",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_ring_side_l",
      "base": "g_ring_side",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_ring_side_r",
      "base": "g_ring_side",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_pinky_side_l",
      "base": "g_pinky_side",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_pinky_side_r",
      "base": "g_pinky_side",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Finger spread",
        "th": "กางนิ้ว"
      },
      "poles": {
        "en": "−1 = toward thumb · +1 = toward pinky",
        "th": "−1 = ไปทางโป้ง · +1 = ไปทางก้อย"
      }
    },
    {
      "id": "g_thumb_side_l",
      "base": "g_thumb_side",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb abduction (in/out of palm plane)",
        "th": "โป้งกางเข้า/ออกระนาบฝ่ามือ"
      },
      "poles": {
        "en": "−1 = in · +1 = out",
        "th": "−1 = เข้า · +1 = ออก"
      }
    },
    {
      "id": "g_thumb_side_r",
      "base": "g_thumb_side",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb abduction (in/out of palm plane)",
        "th": "โป้งกางเข้า/ออกระนาบฝ่ามือ"
      },
      "poles": {
        "en": "−1 = in · +1 = out",
        "th": "−1 = เข้า · +1 = ออก"
      }
    },
    {
      "id": "g_thumb_roll_l",
      "base": "g_thumb_roll",
      "group": "g",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb roll/pronation",
        "th": "โป้งหมุนอุ้งนิ้ว"
      },
      "poles": {
        "en": "−1 = pad out of palm facing · +1 = pad in",
        "th": "−1 = อุ้งออกจากฝ่ามือ · +1 = อุ้งเข้าฝ่ามือ"
      }
    },
    {
      "id": "g_thumb_roll_r",
      "base": "g_thumb_roll",
      "group": "g",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": false,
      "definition": {
        "en": "Thumb roll/pronation",
        "th": "โป้งหมุนอุ้งนิ้ว"
      },
      "poles": {
        "en": "−1 = pad out of palm facing · +1 = pad in",
        "th": "−1 = อุ้งออกจากฝ่ามือ · +1 = อุ้งเข้าฝ่ามือ"
      }
    },
    {
      "id": "h_yaw",
      "base": "h_yaw",
      "group": "h",
      "side": null,
      "default": 0,
      "max": 80,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Turn left/right",
        "th": "หันซ้าย-ขวา"
      },
      "poles": {
        "en": "±80° (max 80)",
        "th": "±80° (max 80)"
      }
    },
    {
      "id": "h_pitch",
      "base": "h_pitch",
      "group": "h",
      "side": null,
      "default": 0,
      "max": 60,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Nod up/down",
        "th": "ก้มเงย"
      },
      "poles": {
        "en": "±60° (max 60)",
        "th": "±60° (max 60)"
      }
    },
    {
      "id": "h_roll",
      "base": "h_roll",
      "group": "h",
      "side": null,
      "default": 0,
      "max": 50,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Tilt head",
        "th": "เอียงหัว"
      },
      "poles": {
        "en": "±50° (max 50)",
        "th": "±50° (max 50)"
      }
    },
    {
      "id": "b_twist",
      "base": "b_twist",
      "group": "b",
      "side": null,
      "default": 0,
      "max": 60,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Twist torso left/right",
        "th": "บิดตัวซ้าย-ขวา"
      },
      "poles": {
        "en": "±60° (max 60)",
        "th": "±60° (max 60)"
      }
    },
    {
      "id": "b_bend",
      "base": "b_bend",
      "group": "b",
      "side": null,
      "default": 0,
      "max": 50,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Bend forward/back",
        "th": "ก้มเงยตัว"
      },
      "poles": {
        "en": "±50° (max 50)",
        "th": "±50° (max 50)"
      }
    },
    {
      "id": "b_lean",
      "base": "b_lean",
      "group": "b",
      "side": null,
      "default": 0,
      "max": 40,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Lean sideways",
        "th": "เอียงตัว"
      },
      "poles": {
        "en": "±40° (max 40)",
        "th": "±40° (max 40)"
      }
    },
    {
      "id": "f_brow_inner",
      "base": "f_brow_inner",
      "group": "f",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Inner brow",
        "th": "คิ้วด้านใน"
      },
      "poles": {
        "en": "−1 = furrow (angry) · +1 = raise",
        "th": "−1 = ขมวด (โกรธ) · +1 = เลิก"
      }
    },
    {
      "id": "f_brow_l",
      "base": "f_brow",
      "group": "f",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Outer brow",
        "th": "คิ้วด้านนอก"
      },
      "poles": {
        "en": "−1 = down · +1 = up",
        "th": "−1 = ลง · +1 = ขึ้น"
      }
    },
    {
      "id": "f_brow_r",
      "base": "f_brow",
      "group": "f",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Outer brow",
        "th": "คิ้วด้านนอก"
      },
      "poles": {
        "en": "−1 = down · +1 = up",
        "th": "−1 = ลง · +1 = ขึ้น"
      }
    },
    {
      "id": "f_eye_l",
      "base": "f_eye",
      "group": "f",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Eyelid",
        "th": "เปลือกตา"
      },
      "poles": {
        "en": "−1 = blink-shut · +1 = wide",
        "th": "−1 = หลับ · +1 = เบิ่ง"
      }
    },
    {
      "id": "f_eye_r",
      "base": "f_eye",
      "group": "f",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Eyelid",
        "th": "เปลือกตา"
      },
      "poles": {
        "en": "−1 = blink-shut · +1 = wide",
        "th": "−1 = หลับ · +1 = เบิ่ง"
      }
    },
    {
      "id": "f_squint_l",
      "base": "f_squint",
      "group": "f",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Eye squint",
        "th": "หยีตา"
      },
      "poles": {
        "en": "0 = neutral · +1 = squeezed (plus-only)",
        "th": "0 = ปกติ · +1 = บีบตา (plus เท่านั้น)"
      }
    },
    {
      "id": "f_squint_r",
      "base": "f_squint",
      "group": "f",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Eye squint",
        "th": "หยีตา"
      },
      "poles": {
        "en": "0 = neutral · +1 = squeezed (plus-only)",
        "th": "0 = ปกติ · +1 = บีบตา (plus เท่านั้น)"
      }
    },
    {
      "id": "f_nose",
      "base": "f_nose",
      "group": "f",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Nose wrinkle / sneer",
        "th": "ย่นจมูก / เชิดจมูก"
      },
      "poles": {
        "en": "0 = neutral · +1 = wrinkled (plus-only)",
        "th": "0 = ปกติ · +1 = ย่น (plus เท่านั้น)"
      }
    },
    {
      "id": "m_mouth_l",
      "base": "m_mouth",
      "group": "m",
      "side": "l",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Mouth corner",
        "th": "มุมปาก"
      },
      "poles": {
        "en": "−1 = frown · +1 = smile",
        "th": "−1 = คว่ำ · +1 = ยิ้ม"
      }
    },
    {
      "id": "m_mouth_r",
      "base": "m_mouth",
      "group": "m",
      "side": "r",
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Mouth corner",
        "th": "มุมปาก"
      },
      "poles": {
        "en": "−1 = frown · +1 = smile",
        "th": "−1 = คว่ำ · +1 = ยิ้ม"
      }
    },
    {
      "id": "m_jaw",
      "base": "m_jaw",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Jaw",
        "th": "ขากรรไกร"
      },
      "poles": {
        "en": "−1 = clench · +1 = open (to yawn)",
        "th": "−1 = กัด · +1 = อ้า (หาว)"
      }
    },
    {
      "id": "m_lips",
      "base": "m_lips",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Lip rounding",
        "th": "ห่อปาก"
      },
      "poles": {
        "en": "−1 = funnel · +1 = pucker",
        "th": "−1 = ห่อ (funnel) · +1 = จู๋ (pucker)"
      }
    },
    {
      "id": "m_wide",
      "base": "m_wide",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Mouth width",
        "th": "ความกว้างปาก"
      },
      "poles": {
        "en": "−1 = narrow (/u/) · +1 = wide (signed)",
        "th": "−1 = แคบ (/u/) · +1 = กว้าง (signed)"
      }
    },
    {
      "id": "m_roll",
      "base": "m_roll",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Lip roll",
        "th": "ม้วนริมฝีปาก"
      },
      "poles": {
        "en": "−1 = lower over upper · +1 = upper over lower",
        "th": "−1 = ล่างทับบน · +1 = บนทับล่าง"
      }
    },
    {
      "id": "m_press",
      "base": "m_press",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Lip press",
        "th": "เม้มปาก"
      },
      "poles": {
        "en": "−1 = relaxed-parted · +1 = pressed/tensed (signed)",
        "th": "−1 = คลาย-แยก · +1 = เม้ม/เกร็ง (signed)"
      }
    },
    {
      "id": "m_fwd",
      "base": "m_fwd",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Mouth/jaw thrust",
        "th": "ยื่นปาก/ขากรรไกร"
      },
      "poles": {
        "en": "0 = neutral · +1 = forward (plus-only)",
        "th": "0 = ปกติ · +1 = ยื่นหน้า (plus เท่านั้น)"
      }
    },
    {
      "id": "m_cheek",
      "base": "m_cheek",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Cheek",
        "th": "แก้ม"
      },
      "poles": {
        "en": "−1 = suck in · +1 = puff out (signed)",
        "th": "−1 = ตอบ · +1 = ป่อง (signed)"
      }
    },
    {
      "id": "m_tongue",
      "base": "m_tongue",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Tongue out",
        "th": "แลบลิ้น"
      },
      "poles": {
        "en": "0 = in · +1 = out/lick (plus-only, best-effort)",
        "th": "0 = เข้า · +1 = ออก/เลีย (plus เท่านั้น, best-effort)"
      }
    },
    {
      "id": "m_teeth",
      "base": "m_teeth",
      "group": "m",
      "side": null,
      "default": 0,
      "max": 1,
      "unipolar": false,
      "circular": false,
      "affect": true,
      "definition": {
        "en": "Teeth bared (lips retracted)",
        "th": "โชว์ฟัน (เปิดริมฝีปาก)"
      },
      "poles": {
        "en": "0 = neutral · +1 = bared (plus-only)",
        "th": "0 = ปกติ · +1 = โชว์ฟัน (plus เท่านั้น)"
      }
    }
  ],
  "hyper_conditions": [
    {
      "id": "eye_lookat",
      "domain": "enum",
      "owner_group": "face",
      "stage": "decode",
      "definition": {
        "en": "Gaze target (front / left hand / right hand / glance left, right, up, down).",
        "th": "เป้าหมายการมอง (มองหน้าตรง / มองมือซ้าย / มองมือขวา / ชำเลืองซ้าย ขวา บน ล่าง)."
      }
    },
    {
      "id": "viseme",
      "domain": "sparse map viseme_* → 0…1",
      "owner_group": "mouth",
      "stage": "decode",
      "definition": {
        "en": "Mouthing: a sparse map of viseme_* shape ids to their share, e.g. {viseme_PP: 0.7, viseme_aa: 0.3} — an absent id is 0, {} is no mouthing, and **the shares sum to at most 1**. SEVERAL shapes may be active at once (each id is its own morph channel, so decode assigns each share directly), and because the value is continuous two mouth keys **crossfade** on interpolation instead of snapping. A map that arrives over budget is clamped per entry then scaled back onto 1.",
        "th": "การขยับปาก: แมปกระจาย (sparse map) จาก id รูปปาก viseme_* ไปยังสัดส่วนของรูปนั้น เช่น {viseme_PP: 0.7, viseme_aa: 0.3} — id ที่ไม่ปรากฏมีค่าเป็น 0, {} คือไม่ขยับปาก และ**ผลรวมของสัดส่วนต้องไม่เกิน 1**. รูปปากหลายรูปทำงานพร้อมกันได้ (แต่ละ id เป็นช่อง morph ของตัวเอง ตอนถอดรหัสจึงกำหนดค่าสัดส่วนลงช่องนั้นตรง ๆ) และเพราะค่าเป็นแบบต่อเนื่อง คีย์ปากสองคีย์จึง**ไล่ข้ามกัน (crossfade)** ตอน interpolate แทนที่จะกระโดด. แมปที่เข้ามาเกินเพดานจะถูกตัดค่าทีละรายการให้ไม่เกิน 1 ก่อน แล้วหารลงให้ผลรวมเป็น 1."
      }
    },
    {
      "id": "contact",
      "domain": "mover site → target site",
      "owner_group": "arm (mover side)",
      "stage": "post-processing",
      "definition": {
        "en": "The mover body site connects to the target site on the fully decoded body; target never moves (§3.4).",
        "th": "จุด mover ไปสัมผัสจุด target บนร่างที่ถอดรหัสสมบูรณ์แล้ว; target ไม่ขยับ (§3.4)."
      }
    },
    {
      "id": "anchor",
      "domain": "body site per arm side",
      "owner_group": "arm (per side)",
      "stage": "post-processing",
      "definition": {
        "en": "An anchored arm's position is measured from its site instead of the neck; an arm with no anchored keys never moves; contact wins on its mover side (§3.4).",
        "th": "แขนข้างที่ anchor วัดตำแหน่งจากจุดของตนแทนคอ; แขนที่คีย์ไม่มี anchor ไม่ขยับ; ฝั่งที่ contact ทำงาน contact ชนะ (§3.4)."
      }
    }
  ],
  "composition": [
    {
      "id": "sequence",
      "syntax": "A | B",
      "since": "1.1.0"
    },
    {
      "id": "gloss",
      "syntax": "NAME, NAME(speed), NAME(speed,label)",
      "since": "1.1.0"
    },
    {
      "id": "variation",
      "syntax": "NAME#var, bare NAME family",
      "since": "1.1.0"
    },
    {
      "id": "alias-composed",
      "syntax": "alias and composed-gloss resolution",
      "since": "1.1.0"
    },
    {
      "id": "auto-gap",
      "syntax": "implicit between items, lead-in, tail-out",
      "since": "1.1.0"
    },
    {
      "id": "pause",
      "syntax": "$pause, $pause(N)",
      "since": "1.1.0"
    },
    {
      "id": "shift",
      "syntax": "$shift(x,y,z,twist), $reset",
      "since": "1.1.0"
    },
    {
      "id": "group",
      "syntax": "[A | B](speed,gap,label)",
      "since": "1.1.0"
    },
    {
      "id": "spell",
      "syntax": "$spell(x,y,z,twist,label){A | B}",
      "since": "1.1.0"
    },
    {
      "id": "expression",
      "syntax": "@name(alpha,rampIn,rampOut), @none, @break",
      "since": "1.1.0"
    },
    {
      "id": "anchor",
      "syntax": "$anchor(site){A | B}",
      "since": "1.1.1"
    },
    {
      "id": "mirror",
      "syntax": "$mirror(speed,label){A | B}",
      "since": "1.1.1"
    },
    {
      "id": "buoy",
      "syntax": "$buoy(speed,label){P}{S}",
      "since": "1.1.1"
    },
    {
      "id": "compound",
      "syntax": "$compound(speed,label){P}{S}, P ; S",
      "since": "1.1.1"
    },
    {
      "id": "viseme",
      "syntax": "$viseme(word,speed)",
      "since": "1.1.1"
    },
    {
      "id": "min-gap-join",
      "syntax": "A || B",
      "since": "1.1.1"
    },
    {
      "id": "neutral-fill",
      "syntax": "NAME!",
      "since": "1.1.1"
    },
    {
      "id": "user-function",
      "syntax": "%name(args)",
      "since": "1.1.2"
    }
  ],
  "copyright": "Copyright (c) 2026 AAT research team, DHCB, National Science and Technology Development Agency (NSTDA), Thailand. All rights reserved."
}
