anchor.diff:              | true, TemplateHole.AfterRender (_, handler) ->
                   e.RemoveAttribute("ws-onafterrender")
                   addAttr e (Attr.OnAfterRender handler)
  -            | _ -> Console.Warn("Unfilled onafterrender", name)
  +            | true, _ -> Console.Warn("onafterrender hole filled with non-onafterrender data", name)
  +            | false, _ -> ()
   
           DomUtility.IterSelector el "[ws-var]" <| fun e ->
               let name = e.GetAttribute("ws-var")
  
positive.code:         DomUtility.IterSelector el "[ws-replace]" <| fun e ->
              let name = e.GetAttribute("ws-replace")
              match tryGetAsDoc name with
              | None -> Console.Warn("Unfilled replace", name)
              | Some doc ->
                  let p = e.ParentElement
                  let after = JS.Document.CreateTextNode("") :> Dom.Node
  
negative.code:             while (p.HasChildNodes()) do
                  p.RemoveChild(p.LastChild) |> ignore
              match tryGetAsDoc name with
              | None -> ()
              | Some doc ->
                  Docs.LinkElement p doc.DocNode
                  holes.JS.Push {
  