anchor.diff:  
   (s/check-asserts true)
   (person-name 100)
  -;; CompilerException clojure.lang.ExceptionInfo: Spec assertion failed
  -;; val: 100 fails predicate: map?
  -;; :clojure.spec.alpha/failure  :assertion-failed
  -;; #:clojure.spec.alpha{:problems [{:path [], :pred map?, :val 100, :via [], :in []}], 
  -;;                      :failure :assertion-failed}
  +;; Execution error - invalid arguments to my.domain/person-name at (REPL:3).
  +;; 100 - failed: map?
   ----
   
   A deeper level of integration is to call conform and use the return value to destructure the input. This will be particularly useful for complex inputs with alternate options.
  
positive.code:    ::players [{::name "Kenny Rogers"
                 ::score 100
                 ::hand [[2 :banana]]}]})
  ;; In: [::players 0 ::hand 0 1] val: :banana fails spec: ::card at: [::players ::hand 1] predicate: suit?
  ----
  
  The error indicates the key path in the data structure down to the invalid value, the non-matching value, the spec part it's trying to match, the path in that spec, and the predicate that failed.
  
negative.code: ;=> true
  (s/explain :event/event
    {:event/type :event/restart})
  ;; #:event{:type :event/restart} - failed: no method at: [:event/restart] 
  ;;   spec: :event/event
  (s/explain :event/event
    {:event/type :event/search
     :search/url 200})
  ;; 200 - failed: string? in: [:search/url] 
  ;;   at: [:event/search :search/url] spec: :search/url
  ;; {:event/type :event/search, :search/url 200} - failed: (contains? % :event/timestamp) 
  ;;   at: [:event/search] spec: :event/event
  ----
  
  Let's take a moment to examine the explain error output on that final example. There were two different kinds of failures detected. The first failure is due to the missing required `:event/timestamp` key in the event. The second is from the invalid `:search/url` value (a number instead of a string). We see the same parts as prior explain errors:
  