It looks as if the static checker doesn't know enough about CompareTo. The following code verifies for me, but without the assumption, the checker complains about not being able to prove the postcondition it gets from the abbreviator.

When you say "adding these assertions", do you mean the ones from your sample like Assert.GreaterThan?

You labeled that one as "working", but I'm not sure that is really working. The checker does not understand tht GetNonZeroNumber returns a positive number. If you modify the method Working_as_intended so that following the call to GetNonZeroNumber you have
"Contract.Assert(0 < n);", you will see that the checker cannot prove it. The reason it is not complaining about the postcondition of Working_as_intended is that it just takes the postcondition from Assert.GreaterThan and "inlines" it so that it knows n
is greater than zero. It is just as if you had written "Contract.Assume(0 < n);" instead of the call to Assert.GreaterThan. It does the same for the generic version of GreaterThan, but then the assumption is just "n.CompareTo(0) > 0". Unfortunately,
there are no contracts on IComparable<T>.CompareTo that would somehow relate that to the postcondition that needs to be proven, e.g., "result > 0". I've contacted Francesco to see what he can say about having the static checker understand this.

The thing that I think *is* wrong is your method GreaterThan_cannot_be_proven. Even if I change the postcondition to "Contract.Ensures(Contract.Result<int>().CompareTo(0) > 0);" the checker is unable to prove the postcondition. I am forwarding that
example to Francesco to look at.