Ah, this appears to be a bug. The rtol for comparing two rationals is defaulting to 0 because the methods for Base.rtoldefault are
rtoldefault(::Type{T}) where {T<:AbstractFloat} = sqrt(eps(T))
rtoldefault(::Type{<:Real}) = 0
This second method seems relatively suspect to me. (alternatively we should have a method for rtoldefault(::Type{Rational{T}}) where {T} = one(T) // isqrt(typemax(T)) which would make this behave as expected.)