@spalladino is correct, this is related to the linearization of the inheritance graph. But it’s not that if we don’t add
Initializable everywhere some contracts may not linearize. It’s that we want the linearization to be exactly the same in
openzeppelin-eth, not only of the contracts in OpenZeppelin but of any contracts that users build by extending them. This prevents headaches when users adapt a contract to be upgradeable, and guarantees that the tests and analyses performed on
openzeppelin-solidity carry over to
Initializable everywhere guarantees this will happen because of the way C3 linearization works. That is very complex to explain in detail in this post, but essentially if
Initializable is first in every list of parent contracts, it will end up first in the resulting linearized list, and the rest of the linearization will proceed as if
Initializable wasn’t there.