ve.ce.ContentBranchNode#renderContents contains the following code (some lines removed for brevity):
```
rendered = this.getRenderedContents();
// Return if unchanged. Test by building the new version and checking DOM-equality.
// However we have to normalize to cope with consecutive text nodes. We can't normalize
// the attached version, because that would close IMEs.
oldWrapper = this.$element[0].cloneNode( true );
newWrapper = this.$element[0].cloneNode( false );
while ( rendered.firstChild ) {
newWrapper.appendChild( rendered.firstChild );
}
ve.normalizeNode( oldWrapper );
ve.normalizeNode( newWrapper );
if ( newWrapper.isEqualNode( oldWrapper ) ) {
return false;
}
```
If the node contains slugs, `oldWrapper` will contain these (because it's a clone of `this.$element`) but `newWrapper` won't (because slugs are added not by `getRenderedContents` but by `setupSlugs`, which is called later), so `.isEqualNode()` will never return true.
This could probably be circumvented by removing slugs from `oldWrapper`, but I wonder how much we really need this check. It seems like we only need it because sometimes a rerender is forced not because a transaction happened but for unicorn-related reasons, and if the unicorn situation turns out not to have changed, we shouldn't make a no-op modification to the DOM. That sounds somewhat sensible, but I wonder if 1) this can ever really occur and 2) this couldn't be detected by comparing transaction and unicorn states.