This is due to the fact that when we initialize the zero value, we use the eltypes or, alternatively, the first values, before we start to add up further dot products. We also have this inconsistency:
julia> using LinearAlgebra
julia> dot(true, true)
true
julia> dot([true], [true])
1
A minimal fix would be to define
dot(x::Bool, y::Bool) = x*y + false
which changes the return type for scalar arguments, but renders the matrix cases (both 2-arg and 3-arg) type-stable. What do you think?