Melt the butter in a small saucepan over low heat.: The moment the butter settles into a steady pool and begins to foam gently, you will smell a warm dairy note, which tells you the fat is ready. Cook over low heat so the butter does not brown, because that would change the flavor profile. If your pan gets too hot, remove it briefly from the burner to cool, then continue. A common error is rushing with high heat, which can burn the fat and impart bitterness, so maintain a gentle temperature and watch for even melting.
Stir in the flour and cook for 3-4 minutes until well combined and a good golden brown.: As you stir the flour into the butter, the mixture will thicken into a paste and begin to give off a toasty, biscuity aroma as it cooks. Continue stirring to avoid scorching, and look for a pale golden color that signals the raw flour taste has cooked out. This step is the foundation for a smooth gravy, and undercooking the roux often leaves a raw flour flavor, while overcooking makes it too dark for a white gravy, so aim for that pale brown stage.
Whisk in 1/4 cup of the milk, the mixture will become a very thick paste. Gradually whisk in 1/4 cup more milk. Once the mixture has thinned slightly you can gradually whisk in the remaining 1 cup of milk. (see note 2): When you add the first small amount of milk, you will notice a thick glue like consistency and a sputtering as steam meets the roux. This initial addition helps loosen the paste slowly, and whisking vigorously prevents lumps from forming. If you pour too much cold milk at once, you risk clumps, so add a little and whisk until smooth. Patience here creates a silky base that will accept the rest of the liquid.
Add the salt and pepper.: The second slow addition should thin the paste further and the aroma will shift toward a faintly cooked cream smell. Keep whisking until the mixture becomes glossy and homogeneous before proceeding. Inexperience often leads to rushing this stage, which causes small flour pockets to persist; steady whisking and small additions avoid that problem and yield a velvety result.
Bring to a low simmer and cook for 2-3 minutes until thickened and glossy.: As you incorporate the bulk of the milk, the sauce will lighten in color and start to flow more freely. The sound will change to a soft simmer and you will see the gravy smooth out and take on a subtle sheen. Maintaining a steady whisk and adding milk in increments prevents sudden temperature shocks that create lumps, so go slowly and stop to smooth any little lumps immediately with vigorous whisking.
Add the heavy cream, taste and season with additional salt and pepper as needed.: At this point the flavors begin to coalesce, and adding the initial seasoning allows the salt and pepper to meld with the dairy. Stir and taste after a minute of gentle heating so you can judge whether to increase either element. A frequent mistake is adding too much salt too early, especially if the fat used was salty, so start modestly and refine the seasoning as the sauce finishes.
Bring to a low simmer and cook for 2 to 3 minutes until thickened and glossy.: During this finishing simmer the gravy will develop a shiny surface and coat the back of a spoon, which is your visual cue that it is ready. The gentle bubbling releases a comforting dairy scent and the texture will tighten slightly as moisture cooks off. Avoid a rolling boil, because high heat can break the emulsion and create a grainy texture; maintain a low simmer and stir occasionally to keep everything even.
Add the heavy cream, taste and season with additional salt and pepper as needed.: The final stir of heavy cream enriches the mouthfeel and adds a luxurious sheen, smoothing any residual grittiness. After folding in the cream, taste carefully and make small seasoning adjustments until the flavor sings for you. One mistake is to skip this tasting step, but finishing seasoning is essential because the cream can soften the perceived saltiness, so adjust gradually until the balance is right.