anchor.diff:  (defrecord Person [first-name last-name email phone])
   
   (s/explain :unq/person
  -           (->Person "Elon" nil nil nil))
  +           (->Person "Bugs" nil nil nil))
   ;; nil - failed: string? in: [:last-name] at: [:last-name] spec: :my.domain/last-name
   ;; nil - failed: string? in: [:email] at: [:email] spec: :my.domain/email-type
   
   (s/conform :unq/person
  -  (->Person "Elon" "Musk" "elon@example.com" nil))
  -;;=> #my.domain.Person{:first-name "Elon", :last-name "Musk", 
  -;;=>                   :email "elon@example.com", :phone nil}
  +  (->Person "Bugs" "Bunny" "bugs@example.com" nil))
  +;;=> #my.domain.Person{:first-name "Bugs", :last-name "Bunny", 
  +;;=>                   :email "bugs@example.com", :phone nil}
   ----
   
   One common occurrence in Clojure is the use of "keyword args" where keyword keys and values are passed in a sequential data structure as options. Spec provides special support for this pattern with the regex op https://clojure.github.io/spec.alpha/clojure.spec.alpha-api.html#clojure.spec.alpha/keys*[`keys*`]. `keys*` has the same syntax and semantics as `keys` but can be embedded inside a sequential regex structure.
  
positive.code: [source,clojure]
  ----
  (s/valid? ::person
    {::first-name "Elon"
     ::last-name "Musk"
     ::email "elon@example.com"})
  ;;=> true
  
  ;; Fails required key check
  (s/explain ::person
    {::first-name "Elon"})
  ;; #:my.domain{:first-name "Elon"} - failed: (contains? % :my.domain/last-name) 
  ;;   spec: :my.domain/person
  ;; #:my.domain{:first-name "Elon"} - failed: (contains? % :my.domain/email)
  ;;   spec: :my.domain/person
  
  ;; Fails attribute conformance
  (s/explain ::person
    {::first-name "Elon"
     ::last-name "Musk"
     ::email "n/a"})
  ;; "n/a" - failed: (re-matches email-regex %) in: [:my.domain/email]
  ;;   at: [:my.domain/email] spec: :my.domain/email-type
  
negative.code: (person-name 42)
  ;;=> java.lang.AssertionError: Assert failed: (s/valid? :my.domain/person person)
  
  (person-name {::first-name "Bugs" ::last-name "Bunny" ::email "bugs@example.com"})
  ;; Bugs Bunny
  ----
  
  When the function is invoked with something that isn't valid `::person` data, the pre-condition fails. Similarly, if there was a bug in our code and the output was not a string, the post-condition would fail.
  