You are incorrect. Contracts are immutable but you can upgrade your application. There are different patterns, one where you make a shell contract that has pointers to contracts with actual business logic.
Also, there are patterns where the user needs to confirm that yes they want to use the new version.
There are also systems of insurance on contracts.