Using s/assert instead of assert has advantages: namely a specific reason why the data failed to meet the spec. But it also has disadvantages: the error message does not contain the assertion code the user wrote, so it's harder to see which assertion failed.
I believe we could have the best of both world if s/assert contained the original "assert" code - that way the error message could (optionally) print out this information.
`
  (require '[clojure.spec.alpha :as s])
  (s/check-asserts true)
  (let [x 1]
(s/assert string? x))
  ;; Spec assertion failed val: 1 fails predicate:
  ;; :clojure.spec.alpha/unknown
  (let [x 1]
(assert (string? x)))
  ;; Assert failed: (string? x)
`