Smart contracts are immutable (code cannot be changed) by design.
Truffle and ZeppelinOS are platforms for the development of smart contracts for Ethereum based blockchains.
Truffle migrate manages the deployment of contracts to blockchain(s). Each time you migrate a contract you deploy a new instance to a new public address. To use the new smart contract instance, users (including dApps) would need to change to use the new address.
ZeppelinOS provides an easy to use, simple, robust, and opt-in upgrade mechanism for smart contracts that can be controlled by any type of governance, be it a multi-sig wallet, a simple address or a complex DAO.
The basic idea is using a proxy for upgrades. The first contract is a simple wrapper or "proxy" which users interact with directly and is in charge of forwarding transactions to and from the second contract, which contains the logic. The key concept to understand is that the logic contract can be replaced while the proxy, or the access point is never changed. Both contracts are still immutable in the sense that their code cannot be changed, but the logic contract can simply be swapped by another contract. The wrapper can thus point to a different logic implementation and in doing so, the software is "upgraded".
You can learn more about ZeppelinOS in the documentation:
If you have further questions about ZeppelinOS please ask in the community forum: