Pat the lamb dry and season with half the salt. Heat the oil in a Dutch oven and brown the lamb in batches; transfer to a plate.
Add cardamom, cloves, and cinnamon to the pot for 30 seconds. Add the onion and cook until deeply golden, 10 to 12 minutes.
Build the Gravy:
Stir in fresh ginger and garlic for 1 minute. Lower the heat and add Kashmiri chile, paprika, fennel, cumin, and ground ginger with a splash of water.
Add the yogurt a few spoonfuls at a time, stirring until incorporated before each addition.
Simmer:
Return the lamb and its juices to the pot. Add the remaining water and salt, bring to a gentle simmer, cover, and cook for 70 to 80 minutes until tender.
Uncover and simmer until the gravy coats the meat. Stir in garam masala, adjust salt, and rest for 10 minutes before serving.
Notes
Kashmiri chile supplies color with moderate heat; do not replace all of it with cayenne.
Bone-in lamb may be used; allow a little extra cooking time.