Sweat the aromatics: In a large pot over medium heat, melt the butter with the olive oil.
Add onion, celery, and carrot. Cook 6–8 minutes, stirring often, until soft and fragrant. Add garlic and cook 30 seconds more.
Build the roux: Sprinkle the flour over the vegetables.
Stir constantly for 1–2 minutes until the flour looks slightly golden and smells toasty. This step prevents a raw flour taste.
Add the liquid gradually: Slowly whisk in the chicken stock, a cup at a time. Keep whisking to avoid lumps.
Add the bay leaf and thyme. Bring to a gentle simmer.
Simmer and thicken: Let the soup bubble softly for 10–12 minutes, stirring occasionally. It will thicken as the flour cooks fully and the flavors meld.
Finish the cream base: Lower the heat.
Stir in the milk and heavy cream. Simmer 3–4 minutes more. Do not boil after adding dairy to avoid curdling.
Add the chicken: Stir in the cooked chicken.
If using mushrooms or peas, add them now. Warm through for 3–5 minutes. Taste and season with salt and black pepper.
Add a splash of sherry or a pinch of nutmeg if you like.
Brighten and serve: Remove the bay leaf. Stir in parsley. Adjust thickness with more stock for a lighter soup or a splash more cream for a richer finish.
Ladle into bowls and serve hot.