anchor.diff:  
       let systemTree = ListTree.makeEmpty<SystemCorrelated<'c, 'w>> ()
       let systemDict = dictPlus<Guid, SystemCorrelated<'c, 'w>> HashIdentity.Structural []
  -    let mutable componentsRegistered = hashSetPlus<Guid> HashIdentity.Structural []
  -    let mutable componentsUnregistered = hashSetPlus<Guid> HashIdentity.Structural []
  +    let mutable registrations = hashSetPlus<Guid> HashIdentity.Structural []
  +    let mutable unregistrations = hashSetPlus<Guid> HashIdentity.Structural []
   
       new (ecs) = SystemHierarchical (false, ecs)
   
       member this.Components with get () = systemTree |> ListTree.map (fun system -> system.Correlateds)
       member this.WithComponentsBuffered fn worldOpt = systemTree |> ListTree.map (fun system -> system.WithCorrelatedsBuffered fn worldOpt)
   
  -    member this.PopComponentStates () =
  -        let (registered, unregistered) = (componentsRegistered, componentsUnregistered)
  -        componentsRegistered <- hashSetPlus<Guid> HashIdentity.Structural []
  -        componentsUnregistered <- hashSetPlus<Guid> HashIdentity.Structural []
  -        (registered, unregistered)
  +    member this.PopHierarchyChanges () =
  +        let (rs, us) = (registrations, unregistrations)
  +        registrations <- hashSetPlus<Guid> HashIdentity.Structural []
  +        unregistrations <- hashSetPlus<Guid> HashIdentity.Structural []
  +        (rs, us)
   
       member this.IndexNode nodeId =
           match systemDict.TryGetValue nodeId with
  
positive.code: 
          // track registration
          if unregistered then
              componentsRegistered.Remove entityId |> ignore<bool>
              componentsUnregistered.Add entityId |> ignore<bool>
  
          // unregister correlation
          if unregistered then
              match ecs.Correlations.TryGetValue entityId with
              | (true, correlation) ->
                  correlation.Remove this.Name |> ignore<bool>
                  ecs.CorrelationsChanged.[entityId] <- correlation
              | (false, _) ->
                  ecs.CorrelationsChanged.[entityId] <- ecs.EmptyCorrelation
  
          // fin
          unregistered
  
negative.code:             match ecs.Correlations.TryGetValue entityId with
              | (true, correlation) ->
                  correlation.Add this.Name |> ignore<bool>
                  ecs.CorrelationChanges.[entityId] <- correlation
              | (false, _) ->
                  ecs.Correlations.Add (entityId, HashSet.singleton StringComparer.Ordinal this.Name)
                  ecs.CorrelationChanges.[entityId] <- ecs.EmptyCorrelation
  
              // make component ref
              ComponentRef.make index correlateds correlatedsBuffered
  