There's your problem right there
If the object implements equiv, it'll get picked up by
For all other types:
Both arguments are the same type defined with deftype.
The type’s equiv method is called and its return value becomes the value of (= x y).
For other types, Java’s x.equals(y) is true.
I'd bet that if you compared = on their seq coercions, you'd find the seqs are =...
(deftype wrapper [xs]
(equiv [this that] false)
(seq [this] (seq xs)))
user=> (let [xs (wrapper. [1 2 3])
ys (wrapper. [1 2 3])]
[(= xs ys) (= (seq xs) (seq ys))])