After thinking about it a bit, this is really weird.
Why do we build a whole list? Because we don't actually care how much over 0 the difference list is, I think we can cut lines 81-97 and replace with this:
```python
for key in (set(self.facts) | set(cached_facts)) - set(self.graylist):
    if self.facts.get(key) != cached_facts.get(key):
        return True
return False
```