I tried your code and am getting points and error bars.
Why are you using character values in a plot format that is intended for numeric data? Character error bars seem meaningless to me. It is like calculating the mean of c("A", "B", "C", "D", "E")
What happens if you just run
ggplot(temp, aes(x = contrast, y = estimate)) +
geom_point()
I'd say this is intentional. "Internally, ggplot2 handles discrete scales by mapping each category to an integer value and then drawing the geom at the corresponding coordinate location."
It's easy to look at a discrete y axis where the labels are numbers and nor realize that they are sorted alphabetically in stead of numerically because they are character strings in stead of integers.