Rinse and soak the rice. Wash basmati rice under cold water until the water runs clear. Soak for 20–30 minutes, then drain. This helps the grains cook long and fluffy.
Marinate the chicken. In a bowl, combine yogurt, garlic, ginger, half the cilantro and mint, lemon juice, ground spices, and 1 teaspoon salt.
Coat the chicken well. Cover and refrigerate 30 minutes (up to overnight for deeper flavor).
Fry the onions. Heat 2 tablespoons oil or ghee in a wide pot over medium heat. Add sliced onions with a pinch of salt.
Cook, stirring, until deep golden and crisp at the edges. Remove half for topping. Keep the rest in the pot.
Sizzle the whole spices. In the same pot, add another tablespoon of ghee if dry.
Stir in bay leaves, cardamom, cloves, cinnamon, black cardamom (if using), and cumin seeds. Cook 30–60 seconds until fragrant.
Build the base. Add tomatoes and green chilies. Cook until tomatoes soften and the oil separates slightly.
Taste and adjust salt.
Add the chicken. Stir in the marinated chicken with all its marinade. Cook uncovered on medium-high for 5–7 minutes, stirring, until the chicken turns opaque and the sauce thickens slightly.
Simmer. Reduce heat, cover, and cook 10–12 minutes, until chicken is just cooked through and still juicy. There should be a rich, saucy gravy—if too dry, splash in a little water; if too runny, simmer uncovered briefly.
Parboil the rice. Bring a large pot of salted water to a boil.
Add soaked, drained rice and a bay leaf or a few whole spices if you like. Boil 5–6 minutes until the grains are about 70% cooked—soft outside, still firm inside. Drain immediately.
Layer the biryani. In the pot with chicken, spread half the parboiled rice over the top.
Sprinkle half the remaining cilantro and mint, some fried onions, and half the saffron milk (if using). Add the rest of the rice and repeat the toppings. Drizzle a final teaspoon of ghee or oil over the top.
Steam (dum) gently. Cover tightly.
You can seal with foil or a clean kitchen towel under the lid. Cook on low heat for 20 minutes. For extra insurance, place the pot on a flat skillet to diffuse heat and prevent scorching.
Rest and fluff. Turn off heat and let it rest 10 minutes.
Gently fluff from the sides with a fork or spoon, mixing slightly while keeping the rice grains intact.
Garnish and serve. Top with more fried onions, herbs, and toasted nuts or raisins if you like. Serve hot with raita, lemon wedges, and a simple salad.