What is best practice for choosing a specific solidity pragma version for production?

When deploying for production it is suggested to choose a fixed version of solidity (0.8.4 instead of ^0.8.4).

But which specific version of solidity is best at any given point in time?
Is it safe to always use the latest version of solidity? Or should we always use a version that is a little bit older?
Is there a standard practice for selection?

There are different bugs for different versions. I think it will be better to use specific version and test this bugs.

Thanks for your input @aldarion that is my current approach!

I do wonder if this is the best way though?

@frangio would you happen to have any input on this?

I'm going to argue against specifying a specific pragma version (in the case of deployed contracts, obviously there is an argument FOR pragma ranges for contracts that are part of a library).

One example is when you are working on a suite of contracts which may take some time to develop. If you lock your contracts to a specific version and there are one or more bug fixes between the start of your development and the release date, you will be forced to change every file with the new pragma version. While the change can be trivial (a sed or using the IDE's find/replace) bulk changes to code can introduce unintended consequences. Additionally, if you find you need to roll back, you need to search and replace again.

Another example applies to contracts which may be used to extend functionality. For example, defi contracts which may be imported into other contracts to automate liquidity pools for example. In this case, setting to a fixed pragma could limit the scope of compiler versions effectly locking 3rd party devs into buggy compilers.

Instead, I think the compiler version should be a one off setting and a range of suitable pragmas should be used for simplicity and portability.