-
1
Set a heavy pot or wok over medium heat and add the oil. Once the oil shimmers, add the onion wedges and cook, stirring occasionally, until the edges soften and the onion becomes translucent — keep the heat moderate so the onion sweetens gently without colouring, because browned onion will muddy both the colour and the clean, aromatic base this curry depends on. Add the whole dry spices — cinnamon stick, cardamom, star anise — and stir for 30 seconds until their fragrance rises into the steam.
-
2
Add the yellow curry paste to the pot and fry it directly in the oil and onion base, pressing and folding it continuously for 2–3 minutes. This is where the dish lives or dies: the paste must fry until it deepens in colour, releases its fat, and the raw sharpness gives way to a rounded, toasted aroma — undercooked paste produces a flat, harsh sauce that no amount of braising will correct. Watch for the oil to weep visibly from the paste and pool at the edges of the pan; that is the signal the paste has given everything it has.
-
3
Add the pieces of lamb shoulder or beef chuck and turn them in the paste until every surface is coated, so the paste begins to penetrate the meat rather than merely surrounding it in the liquid later. Cook over medium heat for 3–4 minutes until the exterior of the meat has lost its raw grey colour on all sides.
-
4
Pour in the evaporated milk and water, then stir to lift and integrate any paste that has caught on the base of the pot, because those concentrated caramelised deposits carry much of the depth in the finished sauce. The sauce will be pale gold and opaque — the evaporated milk will not crack or split under sustained heat as coconut cream would — so bring it to a gentle simmer without anxiety about the heat.
-
5
Reduce the heat to low, partially cover the pot, and braise for 45–60 minutes, stirring every 10–15 minutes so the milk solids on the bottom do not scorch and turn bitter. The meat is ready when a piece yields to gentle pressure from a spoon and separates cleanly without stringiness — it should be thoroughly tender but still hold its shape. The whole spices continue to infuse the liquid throughout this stage.
-
6
Season with fish sauce and a small quantity of sugar, tasting carefully — the evaporated milk's lactose sweetness means less added sugar is required than in a coconut-milk curry, so add the sugar in the smallest increment first and taste again before committing. Adjust until the sauce is savoury, mildly sweet, and warmly spiced. The consistency should be thick enough to cling to a torn piece of roti without running off — if it is too thin, simmer uncovered for a further 5–10 minutes.
-
7
Rest the curry, uncovered, until it reaches serving temperature, or cool completely and refrigerate overnight — resting allows the whole spices to fully integrate and the sauce to tighten to its best consistency without further cooking. Reheat gently before serving. Ladle alongside warm roti canai; the sauce should be thick enough that torn roti scoops rather than absorbs it.