I have some recipes too.
Statistically, the more you commit, the more you break.
The more you play with kernel parts, the more you break.
The more you play with tools used during upgrading, the more you break.
The more you move things across packages, the more you break (things have really improved, it used to be much worse).
The more you remove things (class/methods/instance variables etc...) the more you break.
The more you rename things (class/methods/instance variables etc...) the more you break.
The fastest way to break things is having own idea how better graphics and morphic stuff should be.
Fortunately they often break before you ever got a chance to commit ;)
Changing your own leg while you are running is an art.
Some are really good at that sport, and I'd particularly liked the Colin's way for introducing environments.
If you look at changes, you'll see they described many circles, converting from SystemDictionary to Environment, back to SystemDictionary.