I'm confused as to the distinction between a migration (in truffle) and a fork (project, not ethereum). After the initial migration (deploy), any future migrations create new contracts with new addresses, while all of the old contracts are still alive and clients can connect to them. That seems like a fork to me, or am I missing something?
I also wonder if there established architectural patterns for avoiding forks. For example is it considered a good practice to replace constants with ethereum variables, and expose getter/setter functions for those?