Split more pedantic Liskov checks into separate error codes (and have them disabled by default)
Our rule enforcing the Liskov Substitution Principle on method overrides (currently called invalid-method-override) is currently much stricter than any other type checker's equivalent rule. We should split the more pedantic parts of this rule out into separate error codes, so that it is easier for users switching from other type checkers to incrementally adopt ty: they will then be able to suppress the specific error codes that cover the parts pyright/mypy did not complain about on a per-module basis.
One situation where we are stricter than other type checkers currently is the situation where the subclass method parameter has the same type annotation to the superclass method parameter, but the parameter has a different name. Mypy does not complain about this; pyright does, but only if the method is not a dunder method:
class A:
def method(self, x: int) -> None:
pass
class B(A):
def method(self, y: int) -> None:
pass
Another situation where we are stricter than other type checkers is the case where the superclass parameter is positional-or-keyword, but the subclass parameter is positional-only. Mypy does not complain about this, but pyright does (and for this one, pyright does not distinguish between dunder methods and non-dunder methods).
class A:
def method(self, x: int) -> None:
pass
class B(A):
def method(self, x: int, /) -> None:
pass
Similar to https://github.com/astral-sh/ty/issues/1644, it's very hard to tackle this without propagating the reason for a subtyping failure out of our Type::has_relation_to_impl methods. So this is blocked by https://github.com/astral-sh/ty/issues/163 currently.