Cliff, I often notice this, but it always puzzles me. It may be good advice, but I don't think all ISR/main shared variables MUST be defined volatile.
In fact I don't think my task switcher would work if that was true. So I decided to think about it, but just for a short time. Here's my theory:
If you want a function to repeatedly fetch the variable, then you need to make it volatile. But if you want the function to fetch it only once, then it doesn't need to be volatile.