{
  "id": "wobble_recover",
  "type": "procedural",
  "loop": false,
  "durationSeconds": 0.8,
  "intensity": 0.55,
  "priority": "reaction",
  "transforms": [
    { "time": 0.0, "scale": [1.0, 1.0, 1.0], "positionOffset": [0.0, 0.0, 0.0], "rotationDegrees": [0, 0, 12] },
    { "time": 0.18, "scale": [1.04, 0.97, 1.04], "positionOffset": [0.05, -0.02, 0.0], "rotationDegrees": [4, 0, -9] },
    { "time": 0.36, "scale": [0.98, 1.02, 0.98], "positionOffset": [-0.03, 0.01, 0.0], "rotationDegrees": [-3, 0, 6] },
    { "time": 0.54, "scale": [1.02, 0.99, 1.02], "positionOffset": [0.02, 0.0, 0.0], "rotationDegrees": [2, 0, -3] },
    { "time": 0.72, "scale": [0.99, 1.0, 0.99], "positionOffset": [-0.01, 0.0, 0.0], "rotationDegrees": [-1, 0, 1] },
    { "time": 0.8, "scale": [1.0, 1.0, 1.0], "positionOffset": [0.0, 0.0, 0.0], "rotationDegrees": [0, 0, 0] }
  ],
  "notes": "Damped jelly wobble that settles to rest. Treat the z-rotation as the primary axis (a side-to-side sway) with a smaller x-rotation cross-coupling for a wet jiggle. Amplitude decays roughly geometrically each half-cycle (12 -> 9 -> 6 -> 3 -> 1 -> 0). The animation starts already displaced (12 deg) as if just knocked, so trigger it on a hit; if you need a neutral entry, prepend a 0-time neutral key. Pivot the rotation at the base so the top of the toy swings most. Slight scale jiggle reinforces the soft-body feel."
}
