Warm a large cast-iron skillet over medium-high heat. Break sausage into lumps and drop them into the skillet, spacing them evenly. Cook until browned all over with no traces of pink, about 5 minutes, stirring gently from time to time to break up the meat a bit more. (The ideal texture is a combination of fine, crisp bits dotted with small tender clumps.) Transfer with a slotted spoon to a bowl.
Tilt skillet to pool fat in bottom. If there are less than 3 tablespoons of fat, add enough bacon fat or butter to make up the difference. Sprinkle flour over the pan drippings. Let flour stand for a few seconds so that flour can soak up the fat, then whisk to blend and loosen the browned bits of good stuff from the bottom of the pan. Cook for 2 minutes, whisking continuously. (Don’t shortcut this step. It takes at least 2 minutes for the raw flour taste to cook away.) It’s okay if the roux browns a little, but don’t let it scorch.
Add 3 cups of the warm milk in a slow, steady stream, whisking continuously. Switch from a whisk to a heatproof spatula. Cook until mixture thickens and bubbles, about 10 minutes, stirring slowly, continuously, and evenly over bottom of skillet. Scrape the edges every once in a while.
Return sausage and any accumulated liquid to the skillet. Stir until warmed through and gently bubbling. If gravy gets too thick, add a little more warm milk. No two pans of gravy act the same—use your best judgment. Season very generously with pepper (it’s almost impossible to add too much, Castle says) and serve piping hot.