I know what you mean about the X and Y clobbering/"clobbering" in vanilla. It's one of those things that you know when you see it, but it's hard to nail it down. Typically, I think of it as whether the game is using X or Y to count up or down through a sequence--in that case, feel free to clobber it immediately before or after such a loop. If the function has some LDA, X or LDA, Y, or LDY, X stuff (or STA, X or STZ, X ... i.e. X- and Y-indexed opcodes) going on, and you can't tell where X or Y got set (at least not easily), then leave them alone (meaning preserve them if you need to change them temporarily). Obviously, these are two extremes and there has to be some middle-ground, gray area in between, and it is best to err on the side of caution in such cases...
I think if X or Y or upper A gets clobbered, that tends to lead to fairly devastating bugs that are hard to track, but for lower A, I would say it's almost never a big deal, since lower A is the real workhorse and never really holds anything for very long before it's needed for something else.
Stack mismatches typically manifest fairly magnificently, so those are usually easy to track (unless it's a very rarely taken branch...).
Branching errors can be avoided by using an assembler as long as the logic is sound.
Logic errors can't really be detected except by a 2nd set of eyes.