For the crisp onions, heat the oil in a frying pan, add the onions with a pinch of salt (which helps to stop them burning), then cook on a medium heat, stirring occasionally, until deep golden, about 20-25 mins. When done, spread on paper towels and leave to crisp up. While the onions are frying, put both fish in a frying pan with the chilli. Pour the milk over, cover and simmer for 4 mins. Take off the heat and let stand, covered, for 10 mins to finish gently cooking the fish.
Meanwhile, heat the 3 tbsp oil in a deep frying or sauté pan (with a lid). Add the onion, curry leaves, cardamom and cinnamon and fry until the onion is soft and golden, about 7-8 mins, stirring often. Lift the fish from the milk with a slotted spoon, discard the skin and any bones, cover to keep warm and set aside. Make the milk up to 600ml/1pt with water. Rinse the rice in warm water in a colander, drain, then stir it into the onion. Keep stirring for 1 min so the rice is coated. Pour in the milk mix and stir in the turmeric. Bring to a boil, then simmer for 10 mins, covered, lowering the heat if it starts to stick on the bottom.
When the rice is tender, remove from the heat, drop the butter on top so it melts in, then lay the whole pieces of fish on the rice. Cover and leave for the flavours to mingle. Meanwhile, put the eggs in a pan, cover with cold water and bring to the boil, then boil for 6 mins (for lightly boiled). Remove from the heat and plunge into cold water, cracking the shells against the side of the pan. Peel off the shells and quarter the eggs.
To serve, break the fish into big pieces with a fork, throw in the coriander and stir gently to mix without breaking up the fish, adding the eggs at the end. Season, scatter crisp onions on top and serve with lime wedges for squeezing over.