anchor.diff:              .putIfAbsent(fact.allowed.toRef(), () => new Set())
               .add(fact);
         } else if (fact is Incompatibility) {
  +        // Merge with [Disallowed]s first because they can narrow [fact]'s deps,
  +        // which may allow it to merge with more [Incompatibility]s than it
  +        // would otherwise be able to.
  +        fact = _incompatibilityIntoDisallowed(fact);
  +        if (fact == null) continue;
  +
           fact = _incompatibilityIntoIncompatibilities(fact);
           if (fact == null) continue;
   
  
positive.code:   }
  
    bool _incompatibilityIntoRequired(Incompatibility fact) {
      var required = _required[fact.dep1.name] ?? _required[fact.dep2.name];
      if (required == null) return true;
      var result = _requiredAndIncompatibility(fact);
  
negative.code:     // return `false`.
      if (result != null) _toProcess.add(result);
      return false;
    }
  
    Incompatibility _incompatibilityIntoDisallowed(Incompatibility fact) {
      var disallowed = _disallowed[fact.dep1.toRef()];
      if (disallowed != null) {
        fact = _disallowedAndIncompatibility(disallowed, fact);
        if (fact == null) return null;
      }
  
      var disallowed = _disallowed[fact.dep2.toRef()];
      if (disallowed == null) return fact;
      return _disallowedAndIncompatibility(disallowed, fact);
    }
  
    // Resolves [required] and [disallowed], which should refer to the same
  