I put facts into the Working Set using the this.session.Insert(object fact1) or this.session.InsertAll(IEnumerable<object> fact) methods.
Now, one of the facts changes and I call the this.session.Replace(object fact).
How does NRules know which object to replace? Does it compare the references for equality? Does it call the Equals operator? I'm guessing you're probably using Dictionary logic, so the object's Equals() and GetHashCode() determine when two facts are the same, but I need some affirmation before I continue with my design.
When calling Update, UpdateAll, Retract or RetractAll in NRules, the engine indeed looks the facts up in the Dictionary. So, the engine uses object's Equals and GetHashCode implementation.
However, if updating/retracting the same object instance, it's not necessary to override Equals and GetHashCode, because default implementation for reference types, which uses ReferenceEquals, works just fine.