anchor.diff:              archetype.Unregister archetypeSlot.ArchetypeIndex
               archetypeSlots.Remove entityRef.EntityId |> ignore<bool>
               comps.Add (compName, comp)
  -            let archetypeId = { Terms = Dictionary<_, _> archetype.Id.Terms }
  +            let archetypeId = ArchetypeId.make (Dictionary<_, _> archetype.Id.Terms)
               archetypeId.Terms.Add ("@" + compName, Intra (compName, typeof<'c>, { AlwaysEqualValue = null }))
               let state =
                   match archetypes.TryGetValue archetypeId with
  
positive.code:             let eventData = { EntityRef = entityRef; ContextName = compName }
              this.Publish<EcsRegistrationData, obj> (EcsEvents.Register compName) eventData (state :> obj) :?> 's
          | (false, _) ->
              let archetypeId = { Terms = Dictionary.singleton HashIdentity.Structural ("@" + compName) (Intra (compName, typeof<'c>, { AlwaysEqualValue = null })) }
              let comps = Dictionary.singleton HashIdentity.Structural compName (comp :> obj)
              let state =
                  match archetypes.TryGetValue archetypeId with
  
negative.code: // TODO: 3D: remove any incidental allocation.
  // TODO: 3D: make sure to use proper collection comparer for string keys.
  // TODO: 3D: make sure to use TryAdd in the appropriate places.
  // TODO: 3D: abstract ArchetypeId.
  
  /// Allows a value to always pass as equal with another of its same type.
  type [<CustomEquality; NoComparison>] 'a AlwaysEqual =
  