anchor.diff:    (multiple-value-bind (rid rtype)
         (get-target-id-from-url url)
       (when rid
  -      (list rid (case rtype
  -                  (:rooturl :warstats)
  -                  (:opinion :opinion-warstats)
  -                  (otherwise
  -                   (error "Unknown type")))))))
  +      (values
  +       (list (case rtype
  +               (:rooturl rid)
  +               (:opinion (grab-one (liql rid 'opinion 'opinion.rooturl)))
  +               (otherwise (error "Unknown type")))
  +             :warstats)
  +       rid rtype))))
   
   (defun %tidy-loaded-json (json)
     (hu:alist->hash
  
positive.code:           (getf '(:badge "opinion-badge.svg"
                    :tree "tree.json"
                    :warstats "warstats.json"
                    :opinion-warstats "opin-warstats.json"
                    :references "references.json"
                    :questions "questions.json"
                    :opinions "opinions.json"
  
negative.code:   "First check the in memory cache for warstats, then check the disk storage, then create minimal default stats. Cache is of the format generated by reference-list-for-rooturl. Returned warstats are just for the requested entity, not for the whole tree."
    (or
     (cl-hash-util:hget cache (list url :warstats))
     (multiple-value-bind (spec rid rtype) (%warstats-pathdata-for-url url)
       (when spec
         (let ((path (apply #'make-warstats-path spec)))
           (when (probe-file path)
             (with-open-file (fh path)
               (gethash (if (eq rtype :rooturl) :root rid)
                        (%tidy-loaded-json (json:decode-json fh))))))))
     ;;FIXME: Do we need a full warstats dict?
     (list :effect 1 :controversy 0)))
  
  