When working with a SCM system, when should you branch?
When you need to make changes, based on your current branch, not destined for the next release from that branch (and not before).
For example, we work on trunk usually. Around the time of release, someone's going to need to make a change that we don't want in the current release (it may be before release, at the moment it's usually after release). This is when we branch, to put the release on its own branch and continue development for the next release on trunk.