I would expect that "explain-data" should contain the same "via" entry, regardless of whether it is returned from a call to s/explain-data or if it passed to the printer during an assertion failure.
Repro:
(s/check-asserts true)
(s/def :example/name string?)
(def !ed (atom nil))
(s/explain-data :example/name 1)
;; #:clojure.spec.alpha{:problems [{:path [], :pred clojure.core/string?, :val 1, :via [:example/name], :in []}], :spec :example/name, :value 1}
(try
(binding [s/*explain-out* (fn [ed]
(reset! !ed ed)
"captured")]
(s/assert :example/name 1))
(catch Exception e))
@!ed
;; #:clojure.spec.alpha{:problems [{:path [], :pred clojure.core/string?, :val 1, :via [], :in []}], :spec :example/name, :value 1, :failure :assertion-failed}
Expected: The ":via" entries in both cases should the same
Actual: The ":via" entry is empty in the explain-data that is passed to the printer during the assertion failure.