Question: I've always followed the logic: if assert fails, then there is a bug. Root cause could either be:

* Assert itself is invalid (bug)
* There is a programming error (bug)
* (no other options)

I.E. Are there any other conclusions one could come to? Are there cases where an assert would fail and there is no bug?

Answer: 
That's a good question.

My feeling is, if the assert fails due to your code, then it is a bug. The assertion is an expected behaviour/result of your code, so an assertion failure will be a failure of your code.
If you are using assertions you're following [Bertrand Meyer's Design by Contract](http://en.wikipedia.org/wiki/Design_by_contract) philosophy. It's a programming error - the contract (assertion) you have specified is not being followed by the client (caller).