{
  "_readme": "Mo Shiao — Melbourne Shuffle / Cutting Shapes move graph. Nodes are moves; edges are typed. Node NAMES are sourced (hiplyst 37-move list, 2026-08-27). Node STATES are INFERRED, not measured -- every state field carries state_source:'inferred' until the pose pipeline confirms it. Do not treat an inferred state as a finding.",
  "sources": [
    {
      "id": "hiplyst37",
      "what": "Top 37 shuffle dance moves / cutting shapes",
      "url": "https://www.hiplyst.com/en/top-shuffle-dance-moves-cutting-shapes/",
      "gives": "move names only"
    },
    {
      "id": "wiki_ms",
      "what": "Wikipedia — Melbourne shuffle",
      "gives": "running man + t-step description"
    },
    {
      "id": "thump",
      "what": "THUMP Illustrated Guide to the Hardstyle Shuffle",
      "gives": "kicks, spins, glides, charleston descriptions"
    }
  ],
  "state_legend": {
    "weighted_foot": "L | R | alt | both",
    "facing": "front | side | rotating",
    "travel": "in_place | lateral | forward | backward | rotational",
    "beats": "cycle length in beats (inferred)"
  },
  "nodes": [
    {
      "id": "running_man_basic",
      "name": "Basic Running Man (toe landing)",
      "family": "running_man",
      "difficulty": 1,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "src": [
        "hiplyst37",
        "wiki_ms"
      ],
      "score": 800,
      "degree": 50,
      "tier": "S",
      "beat_breakdown": [
        {
          "count": "1",
          "left_foot": "knee drives up, lands on the BALL",
          "right_foot": "slides back to start, lands on toes",
          "weight": "transfers to left ball",
          "note": "the two happen together, not in sequence"
        },
        {
          "count": "2",
          "left_foot": "slides back to start, lands on toes",
          "right_foot": "knee drives up, lands on the BALL",
          "weight": "transfers to right ball",
          "note": "mirror of count 1"
        }
      ],
      "errors": [],
      "measurables": [
        {
          "name": "knee_lift_peak_deg",
          "why": "hip flexion at the top of the drive — separates a real drive from a shuffle-in-place"
        },
        {
          "name": "slide_overlap_ms",
          "why": "gap between the lift landing and the slide finishing. Sources say 'at the same time'; this is the number that would prove or kill that"
        },
        {
          "name": "cycle_period_ms",
          "why": "autocorrelation on knee height. Against track BPM this gives on-beat error in ms"
        },
        {
          "name": "com_vertical_range_m",
          "why": "bounce. Too much and you are hopping, not running"
        }
      ],
      "video": null,
      "fill_source": "text",
      "fill_note": "Beat breakdown INFERRED from prose descriptions (Wikipedia, THUMP), not from footage. The 'together, not in sequence' note on count 1 is the strongest claim here and is exactly the kind of assertion this project exists to distrust — it is the same 'simultaneous' claim measured 207 times in the martial corpus and explained 4. Treat as hypothesis. errors[] is deliberately EMPTY: no source consulted names a single beginner mistake.",
      "steps": {
        "n_steps": 4,
        "period_frames": 30,
        "period_sec": 1.0,
        "implied_bpm": 60.0,
        "confidence": 0.564,
        "period_from_signal": "knee_r",
        "anchor_frame": 12,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 12,
            "t_sec": 0.4,
            "knee_l_deg": 163.5,
            "knee_r_deg": 82.5,
            "torso_lean_deg": 17.9,
            "image": "/home/david/Source/mo-shiao/frames/running_man_basic/step1_f12.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 20,
            "t_sec": 0.667,
            "knee_l_deg": 164.8,
            "knee_r_deg": 144.3,
            "torso_lean_deg": 9.2,
            "image": "/home/david/Source/mo-shiao/frames/running_man_basic/step2_f20.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 27,
            "t_sec": 0.9,
            "knee_l_deg": 96.4,
            "knee_r_deg": 155.3,
            "torso_lean_deg": 14.0,
            "image": "/home/david/Source/mo-shiao/frames/running_man_basic/step3_f27.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 34,
            "t_sec": 1.133,
            "knee_l_deg": 151.4,
            "knee_r_deg": 155.5,
            "torso_lean_deg": 11.5,
            "image": "/home/david/Source/mo-shiao/frames/running_man_basic/step4_f34.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "1) Running Man",
          "window": "9.3-13s"
        },
        "label_status": "CONFLICTED — two label sources disagree",
        "label_conflict": {
          "on_screen_caption": "on-screen said '1) Running Man'",
          "chapter_metadata": "chapter metadata leaves 0-13s unnamed (intro)",
          "note": "The on-screen numbering runs to 47 moves; the chapter metadata has only 32 entries, so chapters merge several on-screen moves into one span. Neither source is obviously the finer truth."
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Light Running Man (heel landing) (9.7°); Reverse / Backward Running Man (15.9°)",
        "distinguishing feature is TRAVEL DIRECTION, which knee angles cannot see",
        "two label sources disagree: on-screen said '1) Running Man' vs chapter metadata leaves 0-13s unnamed (intro)",
        "OPEN: the landing-surface distinction that defines this row may be pedagogical rather than mechanical — see _toe_vs_flat_open"
      ],
      "signature_neighbours": [
        {
          "move": "Light Running Man (heel landing)",
          "mean_knee_diff_deg": 9.7
        },
        {
          "move": "Reverse / Backward Running Man",
          "mean_knee_diff_deg": 15.9
        }
      ],
      "technique": "Running Man",
      "variation": null,
      "variation_desc": "textbook / beginner form — toe landing, in place",
      "variation_measurable_by": "n/a",
      "reviewer_note": {
        "watch": "9.3-13s",
        "questions": [
          "Which part of the foot lands first — toe, flat, or heel? Pose cannot see this; it is what separates rows 1, 4 and 5.",
          "Does he cover ground, or demo the pattern standing still? Displacement read -0.021 (stationary)."
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "David, 2026-08-28, from practice rather than from the footage: **toe landing is the beginner form, flat is the more advanced variation.** He notes it is hard to see in this video at this resolution — so this row was never resolvable from the clip by anyone, and the answer comes from having done it.",
        "confidence": "human, from practice. Not visible in the source footage.",
        "source": "David"
      },
      "node_kind": "move",
      "variation_skill_order": 1,
      "variation_skill_note": "toe = beginner form; flat = advanced (David, from practice)"
    },
    {
      "id": "running_man_heavy",
      "name": "Heavy Running Man (flat-footed landing)",
      "family": "running_man",
      "difficulty": 1,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "src": [
        "hiplyst37"
      ],
      "score": 400,
      "degree": 50,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Running Man",
      "variation": "flat-footed landing",
      "variation_desc": "flat-footed landing — the ADVANCED form, not a lateral variant",
      "variation_measurable_by": "audio (strike transient) or human",
      "node_kind": "move",
      "variation_skill_order": 2,
      "variation_skill_note": "toe = beginner form; flat = advanced (David, from practice)",
      "needs_human_why": [
        "OPEN: the landing-surface distinction that defines this row may be pedagogical rather than mechanical — see _toe_vs_flat_open"
      ],
      "needs_human": true
    },
    {
      "id": "running_man_light",
      "name": "Light Running Man (heel landing)",
      "family": "running_man",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "src": [
        "hiplyst37"
      ],
      "score": 200,
      "degree": 50,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 31,
        "period_sec": 1.033,
        "implied_bpm": 58.1,
        "confidence": 0.672,
        "period_from_signal": "knee_r",
        "anchor_frame": 8,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 8,
            "t_sec": 0.267,
            "knee_l_deg": 169.0,
            "knee_r_deg": 75.4,
            "torso_lean_deg": 8.1,
            "image": "/home/david/Source/mo-shiao/frames/running_man_light/step1_f8.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 16,
            "t_sec": 0.533,
            "knee_l_deg": 173.3,
            "knee_r_deg": 162.9,
            "torso_lean_deg": 10.4,
            "image": "/home/david/Source/mo-shiao/frames/running_man_light/step2_f16.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 24,
            "t_sec": 0.8,
            "knee_l_deg": 104.6,
            "knee_r_deg": 153.8,
            "torso_lean_deg": 15.3,
            "image": "/home/david/Source/mo-shiao/frames/running_man_light/step3_f24.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 31,
            "t_sec": 1.033,
            "knee_l_deg": 171.9,
            "knee_r_deg": 163.1,
            "torso_lean_deg": 12.6,
            "image": "/home/david/Source/mo-shiao/frames/running_man_light/step4_f31.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "8) Running Man Heel",
          "window": "37.5-41.2s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Basic Running Man (toe landing) (9.7°); Reverse / Backward Running Man (12.5°)",
        "distinguishing feature is TRAVEL DIRECTION, which knee angles cannot see",
        "OPEN: the landing-surface distinction that defines this row may be pedagogical rather than mechanical — see _toe_vs_flat_open"
      ],
      "signature_neighbours": [
        {
          "move": "Basic Running Man (toe landing)",
          "mean_knee_diff_deg": 9.7
        },
        {
          "move": "Reverse / Backward Running Man",
          "mean_knee_diff_deg": 12.5
        }
      ],
      "technique": "Running Man",
      "variation": "heel landing",
      "variation_desc": "heel contacts first",
      "variation_measurable_by": "audio (strike transient) or human",
      "reviewer_note": {
        "watch": "37.5-41.2s",
        "questions": [
          "Same question: is the landing genuinely HEEL-first? This row's only claim to being different from row 1 is the landing surface.",
          "Its knee signature is 9.7° from Basic Running Man — the closest pair in the whole table."
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "Lands 'explicitly on the heel, toes turned up' — the heel-landing variation is confirmed. This is the question pose structurally could not answer.",
        "confidence": "single source: Gemini watching the video. Not independently corroborated.",
        "source": "gemini-2.5-flash analysis, 2026-08-28"
      },
      "node_kind": "move"
    },
    {
      "id": "running_man_apache",
      "name": "Apache Running Man (single, single, double, double)",
      "family": "running_man",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 8
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 8
      },
      "src": [
        "hiplyst37"
      ],
      "score": 133,
      "degree": 50,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Running Man",
      "variation": "single-single-double-double rhythm",
      "variation_desc": "the count is doubled on beats 3-4",
      "variation_measurable_by": "pose — rhythm IS in the cycle",
      "node_kind": "move"
    },
    {
      "id": "running_man_skating",
      "name": "Skating Running Man",
      "family": "running_man",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 2
      },
      "src": [
        "hiplyst37"
      ],
      "score": 117,
      "degree": 44,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Running Man",
      "variation": "lateral glide",
      "variation_desc": "adds sideways travel on the slide",
      "variation_measurable_by": "displacement (COM path) — not yet computed",
      "node_kind": "move"
    },
    {
      "id": "running_man_crossover",
      "name": "Crossover Running Man",
      "family": "running_man",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 117,
      "degree": 44,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Running Man",
      "variation": "crossing step",
      "variation_desc": "the recovering foot crosses the midline",
      "variation_measurable_by": "pose — ankle crossing is visible",
      "node_kind": "move"
    },
    {
      "id": "running_man_reverse",
      "name": "Reverse / Backward Running Man",
      "family": "running_man",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "backward",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "backward",
        "beats": 2
      },
      "src": [
        "hiplyst37"
      ],
      "score": 77,
      "degree": 29,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 30,
        "period_sec": 1.0,
        "implied_bpm": 60.0,
        "confidence": 0.657,
        "period_from_signal": "knee_r",
        "anchor_frame": 23,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 23,
            "t_sec": 0.767,
            "knee_l_deg": 156.3,
            "knee_r_deg": 76.9,
            "torso_lean_deg": 9.9,
            "image": "/home/david/Source/mo-shiao/frames/running_man_reverse/step1_f23.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 30,
            "t_sec": 1.0,
            "knee_l_deg": 161.9,
            "knee_r_deg": 155.0,
            "torso_lean_deg": 7.5,
            "image": "/home/david/Source/mo-shiao/frames/running_man_reverse/step2_f30.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 38,
            "t_sec": 1.267,
            "knee_l_deg": 164.3,
            "knee_r_deg": 159.6,
            "torso_lean_deg": 9.4,
            "image": "/home/david/Source/mo-shiao/frames/running_man_reverse/step3_f38.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 46,
            "t_sec": 1.533,
            "knee_l_deg": 172.5,
            "knee_r_deg": 162.9,
            "torso_lean_deg": 7.6,
            "image": "/home/david/Source/mo-shiao/frames/running_man_reverse/step4_f46.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "2) Running Man Reverse",
          "window": "13.5-17.5s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Light Running Man (heel landing) (12.5°); Basic Running Man (toe landing) (15.9°)",
        "distinguishing feature is TRAVEL DIRECTION, which knee angles cannot see"
      ],
      "signature_neighbours": [
        {
          "move": "Light Running Man (heel landing)",
          "mean_knee_diff_deg": 12.5
        },
        {
          "move": "Basic Running Man (toe landing)",
          "mean_knee_diff_deg": 15.9
        }
      ],
      "technique": "Running Man",
      "variation": "travels backward",
      "variation_desc": "same cycle, opposite direction",
      "variation_measurable_by": "displacement (COM path) — not yet computed",
      "reviewer_note": {
        "watch": "13.5-17.5s",
        "questions": [
          "Does he actually travel BACKWARD here, or cycle the feet in reverse while staying put? Depth measured -0.006, i.e. no travel detected — so either he is not moving, or the clip is too short to show it.",
          "If he is stationary, 'reverse' describes the foot pattern only, and the table should say so."
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_unresolved": "Gemini says it 'travels backward across the room'; my depth measurement found none (-0.006). One of us is wrong and I cannot tell which.",
      "node_kind": "move"
    },
    {
      "id": "running_man_slide",
      "name": "Running Man Slide Variation",
      "family": "running_man",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 117,
      "degree": 44,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Running Man",
      "variation": "extended slide",
      "variation_desc": "the back-slide is lengthened into a glide",
      "variation_measurable_by": "displacement",
      "node_kind": "move"
    },
    {
      "id": "t_step",
      "name": "T-Step",
      "family": "t_step",
      "difficulty": 1,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 2
      },
      "src": [
        "hiplyst37",
        "wiki_ms"
      ],
      "score": 400,
      "degree": 40,
      "tier": "S",
      "beat_breakdown": [
        {
          "count": "1",
          "left_foot": "lifted",
          "right_foot": "heel",
          "weight": "right",
          "note": "Right foot pivots heel out, toes up. Left foot is lifted forward."
        },
        {
          "count": "2",
          "left_foot": "toe",
          "right_foot": "flat",
          "weight": "left",
          "note": "Right foot slides inward, flat on ground. Left foot pivots on toe."
        },
        {
          "count": "3",
          "left_foot": "heel",
          "right_foot": "lifted",
          "weight": "left",
          "note": "Left foot pivots heel out, toes up. Right foot is lifted forward."
        },
        {
          "count": "4",
          "left_foot": "flat",
          "right_foot": "toe",
          "weight": "right",
          "note": "Left foot slides inward, flat on ground. Right foot pivots on toe."
        }
      ],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": "video+a2a",
      "steps": {
        "displacement": {
          "depth_scale_change": 0.059,
          "net_x_torsos_per_cycle": -0.05,
          "net_y_torsos_per_cycle": 0.002,
          "path_length_torsos": 4.1,
          "vertical_range_torsos": 0.219,
          "reads": "travels left"
        },
        "n_steps": 4,
        "period_frames": 15,
        "period_sec": 0.5,
        "implied_bpm": 120.0,
        "confidence": 0.471,
        "period_from_signal": "ankle_sep",
        "anchor_frame": 7,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 7,
            "t_sec": 0.233,
            "knee_l_deg": 130.2,
            "knee_r_deg": 69.8,
            "torso_lean_deg": 19.5,
            "image": "/home/david/Source/mo-shiao/frames/t_step/step1_f7.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 11,
            "t_sec": 0.367,
            "knee_l_deg": 125.6,
            "knee_r_deg": 114.7,
            "torso_lean_deg": 17.0,
            "image": "/home/david/Source/mo-shiao/frames/t_step/step2_f11.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 14,
            "t_sec": 0.467,
            "knee_l_deg": 129.8,
            "knee_r_deg": 141.7,
            "torso_lean_deg": 16.0,
            "image": "/home/david/Source/mo-shiao/frames/t_step/step3_f14.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 18,
            "t_sec": 0.6,
            "knee_l_deg": 141.9,
            "knee_r_deg": 126.6,
            "torso_lean_deg": 19.8,
            "image": "/home/david/Source/mo-shiao/frames/t_step/step4_f18.jpg"
          }
        ]
      },
      "fill_note": "Beat breakdown read from 4 phase-locked frames by gemini-2.5-flash (self-reported confidence: high), batched with 2 other moves in one call. Steps themselves are measured. errors[] came back EMPTY, as instructed -- the frames give no basis for beginner mistakes, and inventing plausible coaching was explicitly forbidden.",
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: The Whip / Propeller / Cow's Tail (14.8°); V-Step / Heel Toe / Happy Feet (15.6°)"
      ],
      "signature_neighbours": [
        {
          "move": "The Whip / Propeller / Cow's Tail",
          "mean_knee_diff_deg": 14.8
        },
        {
          "move": "V-Step / Heel Toe / Happy Feet",
          "mean_knee_diff_deg": 15.6
        }
      ],
      "technique": "T-Step",
      "variation": null,
      "variation_desc": "textbook form — heel-toe pivot, lateral",
      "variation_measurable_by": "n/a",
      "reviewer_note": {
        "watch": "60-66s",
        "questions": [
          "Chapter metadata calls 61-69s 'T-Step Reverse'. Is what he does here the plain T-Step, or the reverse variation?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "57-61s = '13) T-Step' (plain). Re-cut 2026-08-28; the previous 60-66s window was '14) T-Step Reverse'.",
        "confidence": "corroborated: my on-screen read + Gemini's analysis agree",
        "source": "gemini-2.5-flash analysis, 2026-08-28"
      },
      "node_kind": "move"
    },
    {
      "id": "t_step_diamond",
      "name": "Diamond T-Step",
      "family": "t_step",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 8
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 8
      },
      "src": [
        "hiplyst37"
      ],
      "score": 72,
      "degree": 43,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "T-Step",
      "variation": "diamond floor path",
      "variation_desc": "four T-steps tracing a diamond",
      "variation_measurable_by": "displacement (COM path)",
      "node_kind": "move"
    },
    {
      "id": "t_step_cross_side_back_front",
      "name": "T-Step with Cross, Side, Back, Front Steps",
      "family": "t_step",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 8
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 8
      },
      "src": [
        "hiplyst37"
      ],
      "score": 67,
      "degree": 40,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "T-Step",
      "variation": "four-direction stepping",
      "variation_desc": "cross/side/back/front added around the pivot",
      "variation_measurable_by": "displacement",
      "node_kind": "move"
    },
    {
      "id": "t_step_air_kick_cross",
      "name": "T-Step with Air Kick & Cross",
      "family": "t_step",
      "difficulty": 4,
      "cyclic": false,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 54,
      "degree": 43,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "T-Step",
      "variation": "air kick + cross",
      "variation_desc": "a kick is inserted before the cross",
      "variation_measurable_by": "pose — kick is a knee/ankle extreme",
      "node_kind": "move"
    },
    {
      "id": "heel_toe_side_travel",
      "name": "Heel Toe Side Travel",
      "family": "t_step",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "side",
        "travel": "lateral",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 100,
      "degree": 40,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 15,
        "period_sec": 0.5,
        "implied_bpm": 120.0,
        "confidence": 0.358,
        "period_from_signal": "knee_r",
        "anchor_frame": 39,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 39,
            "t_sec": 1.3,
            "knee_l_deg": 90.1,
            "knee_r_deg": 165.8,
            "torso_lean_deg": 25.9,
            "image": "/home/david/Source/mo-shiao/frames/heel_toe_side_travel/step1_f39.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 43,
            "t_sec": 1.433,
            "knee_l_deg": 90.9,
            "knee_r_deg": 167.1,
            "torso_lean_deg": 10.7,
            "image": "/home/david/Source/mo-shiao/frames/heel_toe_side_travel/step2_f43.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 46,
            "t_sec": 1.533,
            "knee_l_deg": 127.2,
            "knee_r_deg": 168.2,
            "torso_lean_deg": 10.6,
            "image": "/home/david/Source/mo-shiao/frames/heel_toe_side_travel/step3_f46.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 50,
            "t_sec": 1.667,
            "knee_l_deg": 153.8,
            "knee_r_deg": 157.5,
            "torso_lean_deg": 8.7,
            "image": "/home/david/Source/mo-shiao/frames/heel_toe_side_travel/step4_f50.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "44) Heel Toe Travel",
          "window": "181-185s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "two label sources disagree: on-screen said '44) Heel Toe Travel' vs chapter metadata says 'Heel Toe Snake' (177-185s)"
      ],
      "signature_neighbours": [],
      "technique": "T-Step",
      "variation": "sustained lateral travel",
      "variation_desc": "the pivot repeats to cover ground sideways",
      "variation_measurable_by": "displacement",
      "reviewer_note": {
        "watch": "181-185s",
        "questions": [
          "CONFLICT: on-screen caption said 'Heel Toe Travel', chapter metadata says this span is 'Heel Toe Snake'. Which is it?",
          "Does he travel sideways across the floor, or work in place?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "On-screen numbering is correct and the chapter metadata is a coarse merge: 177s = '43) Heel Toe Snake', 181s = '44) Heel Toe Travel'. This row's 181-185s window is Heel Toe Travel.",
        "confidence": "corroborated: my on-screen read + Gemini agree",
        "source": "gemini-2.5-flash analysis, 2026-08-28"
      },
      "node_kind": "move"
    },
    {
      "id": "charleston_criss_cross",
      "name": "Criss Cross Charleston",
      "family": "charleston",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37",
        "thump"
      ],
      "score": 200,
      "degree": 50,
      "tier": "S",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 15,
        "period_sec": 0.5,
        "implied_bpm": 120.0,
        "confidence": 0.572,
        "period_from_signal": "ankle_sep",
        "anchor_frame": 15,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 15,
            "t_sec": 0.5,
            "knee_l_deg": 95.1,
            "knee_r_deg": 139.5,
            "torso_lean_deg": 15.8,
            "image": "/home/david/Source/mo-shiao/frames/charleston_criss_cross/step1_f15.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 19,
            "t_sec": 0.633,
            "knee_l_deg": 125.4,
            "knee_r_deg": 141.8,
            "torso_lean_deg": 16.7,
            "image": "/home/david/Source/mo-shiao/frames/charleston_criss_cross/step2_f19.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 22,
            "t_sec": 0.733,
            "knee_l_deg": 141.4,
            "knee_r_deg": 149.3,
            "torso_lean_deg": 18.5,
            "image": "/home/david/Source/mo-shiao/frames/charleston_criss_cross/step3_f22.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 26,
            "t_sec": 0.867,
            "knee_l_deg": 131.1,
            "knee_r_deg": 119.9,
            "torso_lean_deg": 19.5,
            "image": "/home/david/Source/mo-shiao/frames/charleston_criss_cross/step4_f26.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "30) Criss Cross Variation",
          "window": "125-129s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: V-Step / Heel Toe / Happy Feet (13.0°); Hopping V-Back (Hopping Heel Toe) (16.3°)"
      ],
      "signature_neighbours": [
        {
          "move": "V-Step / Heel Toe / Happy Feet",
          "mean_knee_diff_deg": 13.0
        },
        {
          "move": "Hopping V-Back (Hopping Heel Toe)",
          "mean_knee_diff_deg": 16.3
        }
      ],
      "technique": "Charleston",
      "variation": "criss-cross",
      "variation_desc": "feet cross on the swing",
      "variation_measurable_by": "pose — ankle crossing",
      "reviewer_note": {
        "watch": "125-129s",
        "questions": [
          "Do the feet actually cross the midline, or just swing past each other?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "node_kind": "move"
    },
    {
      "id": "charleston_swivel_flicks",
      "name": "Charleston Swivels to Flicks",
      "family": "charleston",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 67,
      "degree": 50,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Charleston",
      "variation": "swivel into flicks",
      "variation_desc": "swivel replaces the plain kick",
      "variation_measurable_by": "pose — ankle rotation",
      "node_kind": "move"
    },
    {
      "id": "charleston_rotating_one_foot",
      "name": "Rotating One-Footed Charleston",
      "family": "charleston",
      "difficulty": 4,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "L",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 8
      },
      "exit": {
        "weighted_foot": "L",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 8
      },
      "src": [
        "hiplyst37"
      ],
      "score": 43,
      "degree": 43,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Charleston",
      "variation": "one-footed rotation",
      "variation_desc": "weight stays on one foot and rotates",
      "variation_measurable_by": "displacement + pose",
      "node_kind": "move"
    },
    {
      "id": "charleston_hook",
      "name": "Hook Charleston",
      "family": "charleston",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 67,
      "degree": 50,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Charleston",
      "variation": "hook",
      "variation_desc": "the kicking leg hooks behind",
      "variation_measurable_by": "pose — ankle path",
      "node_kind": "move"
    },
    {
      "id": "v_step_happy_feet",
      "name": "V-Step / Heel Toe / Happy Feet",
      "family": "happy_feet",
      "difficulty": 1,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 150,
      "degree": 50,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 15,
        "period_sec": 0.5,
        "implied_bpm": 120.0,
        "confidence": 0.537,
        "period_from_signal": "ankle_sep",
        "anchor_frame": 38,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 38,
            "t_sec": 1.267,
            "knee_l_deg": 122.7,
            "knee_r_deg": 134.8,
            "torso_lean_deg": 16.9,
            "image": "/home/david/Source/mo-shiao/frames/v_step_happy_feet/step1_f38.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 42,
            "t_sec": 1.4,
            "knee_l_deg": 148.5,
            "knee_r_deg": 146.4,
            "torso_lean_deg": 19.3,
            "image": "/home/david/Source/mo-shiao/frames/v_step_happy_feet/step2_f42.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 46,
            "t_sec": 1.533,
            "knee_l_deg": 155.2,
            "knee_r_deg": 149.2,
            "torso_lean_deg": 24.2,
            "image": "/home/david/Source/mo-shiao/frames/v_step_happy_feet/step3_f46.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 49,
            "t_sec": 1.633,
            "knee_l_deg": 136.9,
            "knee_r_deg": 143.8,
            "torso_lean_deg": 20.6,
            "image": "/home/david/Source/mo-shiao/frames/v_step_happy_feet/step4_f49.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "39) Happy Feet Combo",
          "window": "161-166s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Criss Cross Charleston (13.0°); Moon Walk Shuffle (13.1°); Spin (13.4°); T-Step (15.6°)"
      ],
      "signature_neighbours": [
        {
          "move": "Criss Cross Charleston",
          "mean_knee_diff_deg": 13.0
        },
        {
          "move": "Moon Walk Shuffle",
          "mean_knee_diff_deg": 13.1
        },
        {
          "move": "Spin",
          "mean_knee_diff_deg": 13.4
        },
        {
          "move": "T-Step",
          "mean_knee_diff_deg": 15.6
        }
      ],
      "technique": "V-Step / Happy Feet",
      "variation": null,
      "variation_desc": "textbook form — heel-toe in and out",
      "variation_measurable_by": "n/a",
      "reviewer_note": {
        "watch": "161-166s",
        "questions": [
          "Source caption was 'Happy Feet Combo' — a COMBO, so it may contain several moves. Is the 161-166s window one repeating move or a sequence?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "node_kind": "move"
    },
    {
      "id": "hopping_v_back",
      "name": "Hopping V-Back (Hopping Heel Toe)",
      "family": "happy_feet",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "backward",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "backward",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 44,
      "degree": 29,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 30,
        "period_sec": 1.0,
        "implied_bpm": 60.0,
        "confidence": 0.507,
        "period_from_signal": "ankle_sep",
        "anchor_frame": 27,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 27,
            "t_sec": 0.9,
            "knee_l_deg": 121.8,
            "knee_r_deg": 113.3,
            "torso_lean_deg": 26.0,
            "image": "/home/david/Source/mo-shiao/frames/hopping_v_back/step1_f27.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 34,
            "t_sec": 1.133,
            "knee_l_deg": 123.4,
            "knee_r_deg": 134.3,
            "torso_lean_deg": 29.2,
            "image": "/home/david/Source/mo-shiao/frames/hopping_v_back/step2_f34.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 42,
            "t_sec": 1.4,
            "knee_l_deg": 115.9,
            "knee_r_deg": 120.2,
            "torso_lean_deg": 23.5,
            "image": "/home/david/Source/mo-shiao/frames/hopping_v_back/step3_f42.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 50,
            "t_sec": 1.667,
            "knee_l_deg": 126.7,
            "knee_r_deg": 129.2,
            "torso_lean_deg": 31.3,
            "image": "/home/david/Source/mo-shiao/frames/hopping_v_back/step4_f50.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "34) V-Step Hop",
          "window": "141-145s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Criss Cross Charleston (16.3°)",
        "two label sources disagree: on-screen said '34) V-Step Hop' vs chapter metadata says 'Criss Cross Hop & Tap' (133-145s)"
      ],
      "signature_neighbours": [
        {
          "move": "Criss Cross Charleston",
          "mean_knee_diff_deg": 16.3
        }
      ],
      "technique": "V-Step / Happy Feet",
      "variation": "hop, travelling back",
      "variation_desc": "both feet leave the floor; travels backward",
      "variation_measurable_by": "pose (vertical COM) + displacement",
      "reviewer_note": {
        "watch": "141-145s",
        "questions": [
          "CONFLICT: on-screen said 'V-Step Hop', chapter metadata says 'Criss Cross Hop & Tap'. Which?",
          "Do BOTH feet leave the floor together (a real hop), or is it a weight shift?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "On-screen correct: 141s = '34) V-Step Hop', distinct from '32) Criss Cross Hop & Tap' at 133s. Gemini also reports BOTH FEET LEAVE THE FLOOR here, which answers the hop-vs-weight-shift question.",
        "confidence": "corroborated: my on-screen read + Gemini agree",
        "source": "gemini-2.5-flash analysis, 2026-08-28"
      },
      "node_kind": "move"
    },
    {
      "id": "house_happy_feet",
      "name": "House Happy Feet",
      "family": "happy_feet",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "both",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 50,
      "degree": 50,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "V-Step / Happy Feet",
      "variation": "house timing",
      "variation_desc": "house-dance phrasing over the same footwork",
      "variation_measurable_by": "audio (music BPM vs step) or human",
      "node_kind": "move"
    },
    {
      "id": "side_slide",
      "name": "Side Slide",
      "family": "travel",
      "difficulty": 2,
      "cyclic": false,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 2
      },
      "src": [
        "hiplyst37",
        "thump"
      ],
      "score": 132,
      "degree": 44,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Travel",
      "variation": null,
      "variation_desc": "textbook form — plain lateral slide",
      "variation_measurable_by": "n/a",
      "node_kind": "move"
    },
    {
      "id": "travel_rocking",
      "name": "Travel Rocking",
      "family": "travel",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "lateral",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 66,
      "degree": 44,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Travel",
      "variation": "rocking",
      "variation_desc": "weight rocks side to side while travelling",
      "variation_measurable_by": "displacement + pose",
      "node_kind": "move"
    },
    {
      "id": "moonwalk_shuffle",
      "name": "Moon Walk Shuffle",
      "family": "travel",
      "difficulty": 3,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "backward",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "backward",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 29,
      "degree": 29,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 30,
        "period_sec": 1.0,
        "implied_bpm": 60.0,
        "confidence": 0.521,
        "period_from_signal": "knee_l",
        "anchor_frame": 37,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 37,
            "t_sec": 1.233,
            "knee_l_deg": 110.7,
            "knee_r_deg": 156.8,
            "torso_lean_deg": 5.1,
            "image": "/home/david/Source/mo-shiao/frames/moonwalk_shuffle/step1_f37.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 44,
            "t_sec": 1.467,
            "knee_l_deg": 156.5,
            "knee_r_deg": 146.0,
            "torso_lean_deg": 10.8,
            "image": "/home/david/Source/mo-shiao/frames/moonwalk_shuffle/step2_f44.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 52,
            "t_sec": 1.733,
            "knee_l_deg": 162.9,
            "knee_r_deg": 119.7,
            "torso_lean_deg": 6.7,
            "image": "/home/david/Source/mo-shiao/frames/moonwalk_shuffle/step3_f52.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 60,
            "t_sec": 2.0,
            "knee_l_deg": 151.3,
            "knee_r_deg": 154.3,
            "torso_lean_deg": 11.3,
            "image": "/home/david/Source/mo-shiao/frames/moonwalk_shuffle/step4_f60.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "3) Running Man Moonwalk",
          "window": "17.5-21.5s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "scored as a single move but it is a COMBINATION — the measurement pipeline has no way to separate two simultaneous components, so cycle and displacement here are averages over two different things"
      ],
      "signature_neighbours": [
        {
          "move": "Spin",
          "mean_knee_diff_deg": 11.4
        },
        {
          "move": "V-Step / Heel Toe / Happy Feet",
          "mean_knee_diff_deg": 13.1
        }
      ],
      "technique": "Travel",
      "variation": "moonwalk",
      "variation_desc": "backward glide with the sliding foot",
      "variation_measurable_by": "displacement",
      "reviewer_note": {
        "watch": "17.5-21.5s",
        "questions": [
          "Depth read +0.107 = travelling TOWARD camera. A moonwalk should go backward. Is the label wrong, is he facing away, or is my sign convention flipped?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_answer": {
        "answer": "NOT a travel question. David, watching the clip 2026-08-28: this is Running Man + Moonwalk performed SIMULTANEOUSLY — two moves combined, not a transition between them. That resolves the three-way disagreement: my depth read (+0.107), Gemini's 'carries the body backward', and Gemini's 'stays in one spot' were each describing one component of a two-component move.",
        "confidence": "human, direct observation — the only source that settled it",
        "source": "David"
      },
      "is_combination": true,
      "combination_of": [
        "Running Man",
        "Moonwalk"
      ],
      "node_kind": "combination",
      "combines": [
        "Running Man",
        "Moonwalk"
      ],
      "combination_note": "Kept as ONE node per the 2026-08-28 decision, not split into parents plus an edge. Its measured cycle and displacement describe the combination as performed — which is the only thing observable — not either component alone."
    },
    {
      "id": "spin",
      "name": "Spin",
      "family": "accent",
      "difficulty": 3,
      "cyclic": false,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 2
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 2
      },
      "src": [
        "hiplyst37",
        "thump"
      ],
      "score": 86,
      "degree": 43,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 30,
        "period_sec": 1.0,
        "implied_bpm": 60.0,
        "confidence": 0.632,
        "period_from_signal": "ankle_y_diff",
        "anchor_frame": 4,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 4,
            "t_sec": 0.133,
            "knee_l_deg": 114.6,
            "knee_r_deg": 159.2,
            "torso_lean_deg": 23.7,
            "image": "/home/david/Source/mo-shiao/frames/spin/step1_f4.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 12,
            "t_sec": 0.4,
            "knee_l_deg": 140.0,
            "knee_r_deg": 137.7,
            "torso_lean_deg": 12.5,
            "image": "/home/david/Source/mo-shiao/frames/spin/step2_f12.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 19,
            "t_sec": 0.633,
            "knee_l_deg": 154.6,
            "knee_r_deg": 144.3,
            "torso_lean_deg": 12.5,
            "image": "/home/david/Source/mo-shiao/frames/spin/step3_f19.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 26,
            "t_sec": 0.867,
            "knee_l_deg": 170.1,
            "knee_r_deg": 163.0,
            "torso_lean_deg": 7.7,
            "image": "/home/david/Source/mo-shiao/frames/spin/step4_f26.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "7) Running Man & Spin",
          "window": "33.2-37s"
        },
        "label_status": "CONFLICTED — two label sources disagree",
        "label_conflict": {
          "on_screen_caption": "on-screen said '7) Running Man & Spin'",
          "chapter_metadata": "chapter metadata says 'Running Man & Kick' (29-37s)",
          "note": "The on-screen numbering runs to 47 moves; the chapter metadata has only 32 entries, so chapters merge several on-screen moves into one span. Neither source is obviously the finer truth."
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: Moon Walk Shuffle (11.4°); V-Step / Heel Toe / Happy Feet (13.4°)",
        "two label sources disagree: on-screen said '7) Running Man & Spin' vs chapter metadata says 'Running Man & Kick' (29-37s)"
      ],
      "signature_neighbours": [
        {
          "move": "Moon Walk Shuffle",
          "mean_knee_diff_deg": 11.4
        },
        {
          "move": "V-Step / Heel Toe / Happy Feet",
          "mean_knee_diff_deg": 13.4
        }
      ],
      "technique": "Accent",
      "variation": null,
      "variation_desc": "textbook form — pivot turn",
      "variation_measurable_by": "pose (shoulder/hip yaw)",
      "reviewer_note": {
        "watch": "33.2-37s",
        "questions": [
          "CONFLICT: on-screen said 'Running Man & Spin', chapter metadata says 'Running Man & Kick'. Is there a spin in this clip at all?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "review_unresolved": "Gemini places 'Running Man & Spin' at 3:33 = 213s. THE VIDEO IS 202.97s LONG. That timestamp cannot exist, so this answer is fabricated and the row stays open.",
      "node_kind": "move"
    },
    {
      "id": "whip_propeller",
      "name": "The Whip / Propeller / Cow's Tail",
      "family": "accent",
      "difficulty": 4,
      "cyclic": false,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "rotating",
        "travel": "rotational",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 32,
      "degree": 43,
      "tier": "B",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "steps": {
        "n_steps": 4,
        "period_frames": 13,
        "period_sec": 0.433,
        "implied_bpm": 138.5,
        "confidence": 0.168,
        "period_from_signal": "ankle_sep",
        "anchor_frame": 34,
        "frame_offset": 0,
        "fill_source": "video",
        "steps": [
          {
            "step": 1,
            "phase": 0.0,
            "frame": 34,
            "t_sec": 1.133,
            "knee_l_deg": 144.5,
            "knee_r_deg": 89.3,
            "torso_lean_deg": 14.7,
            "image": "/home/david/Source/mo-shiao/frames/whip_propeller/step1_f34.jpg"
          },
          {
            "step": 2,
            "phase": 0.25,
            "frame": 37,
            "t_sec": 1.233,
            "knee_l_deg": 137.4,
            "knee_r_deg": 90.4,
            "torso_lean_deg": 15.2,
            "image": "/home/david/Source/mo-shiao/frames/whip_propeller/step2_f37.jpg"
          },
          {
            "step": 3,
            "phase": 0.5,
            "frame": 40,
            "t_sec": 1.333,
            "knee_l_deg": 134.2,
            "knee_r_deg": 126.5,
            "torso_lean_deg": 15.7,
            "image": "/home/david/Source/mo-shiao/frames/whip_propeller/step3_f40.jpg"
          },
          {
            "step": 4,
            "phase": 0.75,
            "frame": 44,
            "t_sec": 1.467,
            "knee_l_deg": 145.6,
            "knee_r_deg": 145.0,
            "torso_lean_deg": 12.2,
            "image": "/home/david/Source/mo-shiao/frames/whip_propeller/step4_f44.jpg"
          }
        ],
        "source": {
          "video": "youtube p2JrE6JICKk",
          "on_screen_caption": "25) Charleston & Cowtail",
          "window": "105-108.5s"
        }
      },
      "needs_human": true,
      "needs_human_why": [
        "knee signature within 18° of: T-Step (14.8°)",
        "periodicity confidence 0.168 is weak (good runs 0.50-0.67)"
      ],
      "signature_neighbours": [
        {
          "move": "T-Step",
          "mean_knee_diff_deg": 14.8
        }
      ],
      "technique": "Accent",
      "variation": "whip / propeller / cow's tail",
      "variation_desc": "the leg whips around the axis",
      "variation_measurable_by": "pose — limb angular speed",
      "reviewer_note": {
        "watch": "105-108.5s",
        "questions": [
          "Weakest row in the table: periodicity confidence 0.168, barely above the floor. Does this clip contain a clean repeating cycle at all, or is it a one-off flourish?"
        ],
        "why_machine_cannot": "pose gives joint angles and screen position; it cannot see foot-strike surface, and depth travel is only inferable from apparent body scale"
      },
      "node_kind": "move"
    },
    {
      "id": "soccer_step",
      "name": "Soccer Step (kick and twist / Indian Step)",
      "family": "accent",
      "difficulty": 2,
      "cyclic": true,
      "state_source": "inferred",
      "entry": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "exit": {
        "weighted_foot": "alt",
        "facing": "front",
        "travel": "in_place",
        "beats": 4
      },
      "src": [
        "hiplyst37"
      ],
      "score": 75,
      "degree": 50,
      "tier": "A",
      "beat_breakdown": [],
      "errors": [],
      "measurables": [],
      "video": null,
      "fill_source": null,
      "technique": "Accent",
      "variation": "kick and twist",
      "variation_desc": "kick paired with an ankle twist",
      "variation_measurable_by": "pose — ankle rotation",
      "node_kind": "move"
    }
  ],
  "edges_documented": [
    {
      "from": "t_step",
      "to": "running_man_basic",
      "type": "transition",
      "src": "hiplyst37",
      "note": "named outright as 'T-Step to Running Man'"
    },
    {
      "from": "running_man_basic",
      "to": "spin",
      "type": "transition",
      "src": "hiplyst37",
      "note": "named as 'Running Man to Skateboard Spin'"
    },
    {
      "from": "charleston_criss_cross",
      "to": "spin",
      "type": "transition",
      "src": "hiplyst37",
      "note": "named as 'Charleston to 4 Spin'"
    }
  ],
  "title": "無仇-No Hating",
  "title_note": "無仇 · Mo Shiao — 'No Hating'. Characters chosen by David 2026-08-27: 仇 (Jyutping mou4 sau4) is enmity / feud / grudge — the character in 報仇, take revenge — so the title reads 'no grudge': competitive without beef, a dance-battle sensibility.\nROMANISATION IS DAVID'S AND STAYS AS HE SPELLS IT. 'Shiao' does not map to a standard Cantonese reading and that does not matter; the name is a signpost pointing at 'no hating', and its spelling is the sign's typography, not its direction. I renamed this to 無敵 / Mo Dik once, on a dictionary's authority, and was rejected twice. Do not do it again — see the sibling project 無字真經 Mo Zi Jun Ging, which exists to warn about exactly this.\nRejected alternatives: 無敵 (mou4 dik6, invincible — already used elsewhere), 無恨 (mou4 han6, no hatred as a feeling).",
  "tiering": {
    "method": "score = (independent_sources x family_size x transition_degree) / difficulty. Corroboration x how much family it unlocks x how well it connects, divided by cost to learn. Tier S is family-deduped: three landings of one move is not an 80/20, it is one move. Tier A allows variants, capped at 3 per family so the path stays broad.",
    "caveat": "degree comes from INFERRED states. Re-run after the pose pipeline measures real exit states."
  },
  "title_en": "No Hating",
  "_method_note": "Window length matters and 4s is the floor. Measured 2026-08-28: a 3s window (90 frames) scored confidence 0.027 on footage where a 3.7s window scored 0.672 -- a 0.6s cycle only repeats ~5 times in 3s, which autocorrelation cannot work with. steps.py now refuses anything under 0.15 rather than recording a number that is not a measurement. Captions in the source change every ~4s, so the usable window and the honest label are the same span.",
  "_needs_human_rule": "needs_human is set when a row cannot be settled by this pipeline alone. Three triggers: (1) the measured knee signature sits within 18° of another move, so the numbers do not separate them; (2) the second model returned anything other than MATCHES; (3) the move's distinguishing feature is travel direction, which knee angles cannot see at all. Trigger 3 is the important one: Light Running Man and Reverse Running Man differ by 12.5° -- the closest pair in the set -- because the ONLY difference between them is which way the dancer travels, and this pipeline measures the cycle, not the displacement.",
  "_label_ground_truth_warning": "THE SOURCE DISCLAIMS ITS OWN LABELS. The video description states: 'The terms for each move are not completely accurate as I learned through freestyling or watching videos. Also, most of these moves aren't considered shuffle moves but are steps that I use often for shuffling.' So every 'verified caption' in this file rests on names the author says are approximate. Combined with the on-screen vs chapter-metadata conflicts, there is no reliable machine-readable ground truth for move names in this source. needs_human is therefore not a temporary measurement limitation -- it is a property of the domain. The names have to come from someone who knows the moves in their body.",
  "_metadata_lesson": "yt-dlp --print '%(chapters)s' returns 32 titled, timestamped chapters for this video. The white-pixel caption detector, frame extraction and image reading built on 2026-08-28 recovered a worse version of data that was already structured and free. CHECK THE METADATA FIRST.",
  "_technique_vs_variation": "David's model, 2026-08-28. A row has a TECHNIQUE (the base movement) and a VARIATION (how this one departs from the textbook form). Variation is None when the execution IS the canonical form. Deadlift vs RDL: same hinge, named difference.\nWhy it fixes the naming problem: the measurements separate TECHNIQUES reliably (pose recovered the running-man / t-step / happy-feet groupings blind, from numbers alone) and never separate named moves. So technique is machine-fillable and variation is the human column. It also dissolves the four label CONFLICTS -- 'Heel Toe Snake' vs 'Heel Toe Travel' disagree about the variation, never about the technique.\nvariation_measurable_by is a roadmap, not a status: 'displacement' means it would be fillable if the pipeline computed COM path (it does not yet); 'audio' means a foot-strike transient could settle heel vs toe, which pose cannot see at all; 'human' means nothing available will do it.",
  "_gemini_reliability_note": "Gemini's analysis of this video (2026-08-28) was useful for caption ORDERING -- it independently reproduced the on-screen numbering I read off the frames, which resolves three label conflicts in favour of the on-screen captions over the chapter metadata. It is NOT reliable for travel direction or timestamps. It cited a move at 3:33 in a 202.97s video, and gave opposite answers about the same moonwalk clip depending on whether it was reading frames, watching the video, or writing prose -- the third instability observed in one evening (the others: verdict flipped when shown vs not shown a label; frames vs video). Use it where a second independent read corroborates something I already measured. Do not use it as an oracle.",
  "_edge_types": {
    "VARIANT": "same technique, different execution (toe vs heel landing). Computed from family + signature.",
    "TRANSITION": "A then B, sequential. Gated by exit-state / entry-state compatibility.",
    "COMBINATION": "A and B performed SIMULTANEOUSLY — not one after the other. David identified this 2026-08-28 watching 'Running Man Moonwalk': it is not a running man that becomes a moonwalk, it is both at once, upper pattern and lower glide. This is a THIRD relationship the graph did not have, and its absence caused a measurement failure: three sources disagreed about whether that clip travels, because the running-man component is stationary and the moonwalk component travels. Each source described one half. A combination cannot be scored as a single move."
  },
  "_combination_evidence": {
    "note": "The source video's own naming distinguishes these. '&' marks a simultaneous combination; 'Reverse', 'Heel', 'Variation', 'Angle' mark variations of one technique. That is the creator encoding the same distinction independently, which is corroboration rather than my imposition.",
    "combination_captions": [
      "Running Man & Heel Twist",
      "Running Man & T-Step",
      "Running Man & Kick",
      "Running Man & Stepback",
      "Diagonal Running Man & Flick",
      "Charleston & Cowtail",
      "Charleston & Running Man",
      "Criss Cross Hop & Tap",
      "Heel Toe & Toe Twist",
      "Heel Toe Travel & Flick"
    ],
    "count": 10,
    "also_combination_without_ampersand": [
      "Running Man Moonwalk — David's reading: both at once, no '&' used"
    ]
  },
  "_combination_modelling": {
    "decision": "A combination gets ONE NEW NODE of its own. David, 2026-08-28. PROVISIONAL.",
    "reasoning": "Two models were on the table. (a) Two nodes plus a COMBINATION edge — compositional, keeps the graph small, says a combination is fully explained by its parts. (b) One new node — says the combination is its own thing. David's argument for (b): 'offspring are not just a combination of their parents, it is its own thing.' Emergence over composition.",
    "why_it_matters_for_measurement": "Under (a) you would try to decompose a measurement into two components, which this pipeline cannot do — that failure is exactly what broke the moonwalk row. Under (b) you measure the combination AS PERFORMED, which is the only thing actually observable. So (b) is also the operationally honest choice, independent of the philosophy.",
    "kept_open": "Not settled. If combinations turn out to be predictable from their parts — cycle, displacement and signature all falling between the two parents — that is evidence for (a) and the schema should change. Nothing measured yet tests this. It would need several combinations measured alongside both their parent moves.",
    "candidates_not_yet_created": [
      "Running Man & Heel Twist",
      "Running Man & T-Step",
      "Running Man & Kick",
      "Running Man & Stepback",
      "Diagonal Running Man & Flick",
      "Charleston & Cowtail",
      "Charleston & Running Man",
      "Criss Cross Hop & Tap",
      "Heel Toe & Toe Twist",
      "Heel Toe Travel & Flick"
    ]
  },
  "_variation_ordering": {
    "finding": "Variations of a technique can be ORDERED by skill, not just enumerated. Toe landing (beginner) -> flat landing (advanced) on the Running Man is the first instance found. The variation column was built as a flat set; it needs a progression axis.",
    "why_it_matters": "It changes what the table is for. A flat set of variations answers 'what exists'. An ordered one answers 'what comes next', which is what a practice book needs. It also means difficulty is a property of the VARIATION, not only of the technique.",
    "consequence_flagged_not_applied": "Heavy Running Man (flat landing) currently carries difficulty 1, the same as Basic (toe). If flat is the advanced form that is wrong, and fixing it changes its 80/20 score and possibly its tier. NOT changed unilaterally — the tier list was already reviewed and approved, and rescoring it silently would invalidate that.",
    "open_question": "Does the same beginner->advanced ordering exist inside the other techniques? T-Step, Charleston and V-Step each have several variations and none is currently ordered."
  },
  "_toe_vs_flat_open": {
    "status": "OPEN HYPOTHESIS — David's own revision of his answer, offered as a guess, 2026-08-28.",
    "claim": "Toe-vs-flat may be PEDAGOGICAL rather than mechanical. His reasoning: the slide requires a flat foot, so 'toe first, then flat' is partly redundant — the movement needs flat regardless. 'Toe' may be what you tell a beginner because it is easier to comprehend, not a different contact.",
    "why_this_matters_to_the_table": "Three rows — Basic (toe), Heavy (flat), Light (heel) — exist ONLY because of the landing surface. If toe and flat are the same movement described two ways for two audiences, two of those rows are one row and the table is carrying a distinction the body does not make.",
    "same_shape_as": "The 'simultaneous' finding in the martial corpus: asserted 207 times, explained 4. A cue repeated until it reads as a mechanism. This project exists to catch exactly that, and here it may be doing it to a dance vocabulary instead of a martial one.",
    "what_would_test_it": [
      "Foot-strike AUDIO. A toe/ball contact and a flat contact have different transients. If beginner and advanced demos sound the same at contact, the distinction is verbal.",
      "Several dancers, same move, same instruction. If 'toe' produces flat contacts anyway, it is a cue.",
      "David's own body: try it deliberately both ways and see whether the slide survives a true toe landing."
    ],
    "note": "Do not resolve the three rows on this until it is tested. Recorded as a question, not an answer."
  },
  "_contact_taxonomy": {
    "insight": "David, 2026-08-28: every movement in this form is TOE, HEEL or FLAT based — the contact surface is the organising variable, not the limb pattern. Explicitly compared to snowboarding, which is entirely toe-edge vs heel-edge.",
    "why_it_is_useful": "It gives the variation column a physical axis instead of a list of names, and it identifies a donor sport: snowboarding has a mature conditioning literature for exactly this ankle problem, and shuffle has none. The T-Step is an edge transition performed without a board — the same ankle action, so the training should transfer.",
    "drills": "see DRILLS.md — grafted, not validated. Nobody has tested transfer.",
    "corpus_gap": "mcp-sport.db has ZERO board-sport collections across 76. kega-acquire candidate.",
    "caveat": "Partly rests on the toe-vs-flat distinction, which _toe_vs_flat_open flags as possibly pedagogical."
  }
}