You need to imagine how people will interact with your code and write just enough to help them understand the things that aren't already self evident.
I've found that the most clean, well maintained codebases I've worked with had VERY sparse comments, but the ones that did exist were critical to quickly understanding the "why."